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
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