Пытался сделать клиент серверное приложение и зашифровать канал связи и передачи ключей Алгоритм Диффи-Хеллмана (англ. Diffie–Hellman, DH), а информацию зашифровать RSA, AES, или алгоритмом Эль-гамаля (это было в вузе), которая будет передаваться. В итоге у меня падает тест так как инстанс класса DiffieHellman не создает
PublicKey
как в статье на CodeProject. Ну или свойство
PublicKey
у меня почему-то
null
Так же этот код не работает у меня на Macbook PRO. Microsoft сделала System.Security.Cryptography; cross-platfrom или нет?
Статья на CodeProject -
https://www.codeproject.com/Articles/1219531/Imple...
Code метода шифрования:
public async Task<byte[]> EncryptAsync(byte[] publicKey, string secretMessage, CancellationToken cancellationToken)
{
byte[] encryptedMessage;
var key = CngKey.Import(publicKey, CngKeyBlobFormat.EccPublicBlob);
var derivedKey = _ECDiffieHellmanCng.DeriveKeyMaterial(key); // "Common secret"
_aes.Key = derivedKey;
using (var cipherText = new MemoryStream())
{
using (var encryptor = _aes.CreateEncryptor())
{
using (var cryptoStream = new CryptoStream(cipherText, encryptor, CryptoStreamMode.Write))
{
byte[] ciphertextMessage = Encoding.UTF8.GetBytes(secretMessage);
await cryptoStream.WriteAsync(ciphertextMessage, 0, ciphertextMessage.Length, cancellationToken);
}
}
encryptedMessage = cipherText.ToArray();
}
return encryptedMessage;
}
Code тестов:
private Business.DiffieHellman _diffieHellmanAlice { get; set; }
private Business.DiffieHellman _diffieHellmanBob { get; set; }
private string _text { get; set; }
[SetUp]
public void Setup()
{
_diffieHellmanAlice = new Business.DiffieHellman();
_diffieHellmanBob = new Business.DiffieHellman();
_text = "My random text";
}
[Test]
public async Task EncryptDecrypt_ShouldBeTrue()
{
// Кидает исключение тк PublicKey is null
var encryptedMsg = await _diffieHellmanAlice.EncryptAsync(_diffieHellmanBob.PublicKey, _text, new System.Threading.CancellationToken());
}
Скриншот тестов:
Скриншот метода с входными параметрами: