2015-07-10 8 views
11

'u uygulayan bir anahtar türevleme işlevine sahiptir. Elimde NIST SP 800-56A'da açıklanan anahtar türetme işlevini kullanarak anahtar malzemeyi türetmeyi gerektiren bir görev var. 5.8.1. Kriptografide uzman değilim, bu yüzden soru saf ise lütfen bana izin verin. .NET'te ECDiffieHellmanCng, NIST SP 800-56A, bölüm 5.8.1

  1. Ben karşı tarafın ortak anahtar ve benim özel anahtar
  2. Şimdi C# kullanarak ECDH 1.3.132.1.12 kullanarak paylaşılan gizli oluşturmak için deneyin (.NET var: İşte ben bugüne kadar ne yaptık bulunuyor şöyle 4) ECDiffieHellmanCng sınıfı:

    // The GetCngKey method reads the private key from a certificate in my Personal certificate store 
    
    CngKey cngPrivateKey = GetCngKey(); 
    
    ECDiffieHellmanCng ecDiffieHellmanCng = new ECDiffieHellmanCng(cngPrivateKey); 
    
    ecDiffieHellmanCng.HashAlgorithm = CngAlgorithm.ECDiffieHellmanP256; 
    ecDiffieHellmanCng.KeyDerivationFunction = ?? // What do I set here 
    

Nihayet bu yapın:

ecDiffieHellmanCng.DeriveKeyMaterial(otherPartyPublicKey:); 

Diğer parametreleri nerede ve nasıl ayarlayabilirim? Algoritma Kimliği, Parti U Bilgisi, Parti V Bilgisi?

DÜZENLEME I (sağlanan onlar .NET çağrılabilir)

cevap

8

TL Bouncy Castle gibi diğer kütüphaneleri kullanılarak açığım; DR; .NET 4.0 tek başına

iyi haber (benim için :-)) kullanarak NIST SP 800-56A, 5.8.1 bölümünde açıklanan KDF kullanarak simetrik anahtar türetmenin bir yolunu bulamadım NET 4.0 güzel BouncyCastle kütüphanesi (NuGet: Install-Package BouncyCastle-Ext -Version "1.7.0") kullanarak mümkün olmasıdır.

: ADIM 1: diğer parti senaryonuz bağlı olarak anahtar

kamu, bu sertifikadan okumak veya şifreli verileri içeren mesajın bir parçası olarak size gelmek olabilir Get İşte nasıl.

var publicKeyBytes = Convert.FromBase64String(base64PubKeyStr); 
ECPublicKeyParameters otherPartyPublicKey = (ECPublicKeyParameters)PublicKeyFactory.CreateKey(publicKeyBytes); 

ADIM 2: Eğer Base64 kodlanmış genel anahtar aldıktan sonra şöyle itiraz bir Org.BouncyCastle.Crypto.Parameters.ECPublicKeyParameters içine okumak Oku sizin özel anahtar

Bu most- ediyorum Genellikle bir PFX/P12 sertifikasından özel anahtarı okumak içerir. Kodu çalıştıran windows hesabı PFX/P12'ye erişmelidir ve ayrıca sertifika bir sertifika deposuna aktarılırsa, tüm görevler üzerinden izinler vermeniz gerekir -> certmgr.msc

'daki özel anahtarı yönet
using (StreamReader reader = new StreamReader(path)) 
{ 
    var fs = reader.BaseStream; 
    string password = "<password for the PFX>"; 
    Pkcs12Store store = new Pkcs12Store(fs, passWord.ToCharArray()); 

    foreach (string n in store.Aliases) 
    { 
     if (store.IsKeyEntry(n)) 
     { 
      AsymmetricKeyEntry asymmetricKey = store.GetKey(n); 

      if (asymmetricKey.Key.IsPrivate) 
      { 
       ECPrivateKeyParameters privateKey = asymmetricKey.Key as ECPrivateKeyParameters; 
      } 
     } 
    } 
} 

ADIM 3: hesaplayın paylaşılan gizli

IBasicAgreement aKeyAgree = AgreementUtilities.GetBasicAgreement("ECDH"); 
aKeyAgree.Init(privateKey); 
BigInteger sharedSecret = aKeyAgree.CalculateAgreement(otherPartyPublicKey); 
byte[] sharedSecretBytes = sharedSecret.ToByteArray(); 

ADIM 4:

byte[] algorithmId = Encoding.ASCII.GetBytes(("<prependString/Hex>" + "id-aes256-GCM")); 
byte[] partyUInfo = Encoding.ASCII.GetBytes("<as-per-agreement>"); 
byte[] partyVInfo = <as-per-agreement>; 
MemoryStream stream = new MemoryStream(algorithmId.Length + partyUInfo.Length + partyVInfo.Length); 
var sr = new BinaryWriter(stream); 
sr.Write(algorithmId); 
sr.Flush(); 
sr.Write(partyUInfo); 
sr.Flush(); 
sr.Write(partyVInfo); 
sr.Flush(); 
stream.Position = 0; 
byte[] keyCalculationInfo = stream.GetBuffer(); 

ADIM 5: simetrik anahtar hesaplamak için gerekli hazırlayın bilgi sy türetin mmetric anahtar

// NOTE: Use the digest/Hash function as per your agreement with the other party 
IDigest digest = new Sha256Digest(); 
byte[] symmetricKey = new byte[digest.GetDigestSize()]; 
digest.Update((byte)(1 >> 24)); 
digest.Update((byte)(1 >> 16)); 
digest.Update((byte)(1 >> 8)); 
digest.Update((byte)1); 
digest.BlockUpdate(sharedSecret, 0, sharedSecret.Length); 
digest.BlockUpdate(keyCalculationInfo, 0, keyCalculationInfo.Length); 
digest.DoFinal(symmetricKey, 0); 

Simetrik anahtar şifre çözme işlemini yapmaya hazırdır. AES kullanarak şifre çözme işlemini gerçekleştirmek için BouncyCastle IWrapper kullanılabilir. WrapperUtilities.GetWrapper ("AES //") çağrısıyla Org.BouncyCastle.Security.WrapperUtilities kullanarak bir IWrapper edinin. "AES/CBC/PKCS7". Bu aynı zamanda, iki iletişim kurucu taraf arasındaki anlaşmaya da bağlı olacaktır.

Şifreyi (IWrapper) simetrik anahtar ve başlatma vektörü (IV) ile sıfırlayın ve düz metin baytları almak için Yeniden Sarma yöntemini çağırın. Son olarak, (örneğin UTF8/ASCII/Unicode) şifreleme tarafında

+0

kullanılan karakter kodlamasını kullanarak değişmez dizeye dönüştürmek, BouncyCastle ConcatenationKDFGenerator sınıfını https://github.com/bcgit/bc-csharp/blob/0801c1543f0cafc79c44b225e53c973bdd1b0a0f/ vardır kripto/src/kripto/anlaşma/kdf/ConcatenationKdfGenerator.cs – Sentinel