타원 곡선 암호화의 구현을 .NET 플랫폼에서 사용하도록 제안 할 수 있습니까?타원 곡선 암호화의 .NET 구현 (라이브러리)
또한 사용했다면 권장 곡선을 말해야합니까?
[편집]
@FatCat가 언급 한 바와 같이, 그 구현은 .NET 프레임 워크 3.5에서 사용할 수 있지만이 윈도우 비스타에서만 사용할 수 있습니다. 다른 방법/라이브러리를 사용 하시겠습니까?
타원 곡선 암호화의 구현을 .NET 플랫폼에서 사용하도록 제안 할 수 있습니까?타원 곡선 암호화의 .NET 구현 (라이브러리)
또한 사용했다면 권장 곡선을 말해야합니까?
[편집]
@FatCat가 언급 한 바와 같이, 그 구현은 .NET 프레임 워크 3.5에서 사용할 수 있지만이 윈도우 비스타에서만 사용할 수 있습니다. 다른 방법/라이브러리를 사용 하시겠습니까?
C# 용 Bouncy Castle 라이브러리를 확인하십시오. ECDH와 ECDSA가 있습니다.
.NET Framework에는 이미 타원 곡선 암호화 알고리즘 인 Diffie-Hellman이 포함되어 있습니다. System.Security.Cryptography.ECDiffieHellmanCng 아래를보십시오.
일반적으로 ECC를 암호화에 사용하는 방법은 "Ephemeral-Static Diffie-Hellman"을 사용하는 것입니다.
그것은이 방식으로 작동합니다. 이것은 정적 키입니다.
수신자는 이제 임시 공개 키와 자신의 정적 개인 키를 사용하여 대칭 키를 다시 만들고 데이터를 해독 할 수 있습니다.
자세한 내용은 Standards for Efficient Cryptography: SEC 1: Elliptic Curve Cryptography 섹션 5.1.3을 참조하십시오.
는 SecureBlackBox 구성 요소
대에서보세요! 나는 그것을 시도했지만 위선적으로 메시지를 암호화하는 방법을 찾지 못했습니다. 는 "암호화"기능
이 System.Security.Cryptography.ECDiffieHellmanCng
에 대한 MSDN의 샘플을 갖고있는 것 같다하지 않습니다.
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
class Alice
{
public static byte[] alicePublicKey;
public static void Main(string[] args)
{
using (ECDiffieHellmanCng alice = new ECDiffieHellmanCng())
{
alice.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
alice.HashAlgorithm = CngAlgorithm.Sha256;
alicePublicKey = alice.PublicKey.ToByteArray();
Bob bob = new Bob();
CngKey k = CngKey.Import(bob.bobPublicKey, CngKeyBlobFormat.EccPublicBlob);
byte[] aliceKey = alice.DeriveKeyMaterial(CngKey.Import(bob.bobPublicKey, CngKeyBlobFormat.EccPublicBlob));
byte[] encryptedMessage = null;
byte[] iv = null;
Send(aliceKey, "Secret message", out encryptedMessage, out iv);
bob.Receive(encryptedMessage, iv);
}
}
private static void Send(byte[] key, string secretMessage, out byte[] encryptedMessage, out byte[] iv)
{
using (Aes aes = new AesCryptoServiceProvider())
{
aes.Key = key;
iv = aes.IV;
// Encrypt the message
using (MemoryStream ciphertext = new MemoryStream())
using (CryptoStream cs = new CryptoStream(ciphertext, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
byte[] plaintextMessage = Encoding.UTF8.GetBytes(secretMessage);
cs.Write(plaintextMessage, 0, plaintextMessage.Length);
cs.Close();
encryptedMessage = ciphertext.ToArray();
}
}
}
}
public class Bob
{
public byte[] bobPublicKey;
private byte[] bobKey;
public Bob()
{
using (ECDiffieHellmanCng bob = new ECDiffieHellmanCng())
{
bob.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
bob.HashAlgorithm = CngAlgorithm.Sha256;
bobPublicKey = bob.PublicKey.ToByteArray();
bobKey = bob.DeriveKeyMaterial(CngKey.Import(Alice.alicePublicKey, CngKeyBlobFormat.EccPublicBlob));
}
}
public void Receive(byte[] encryptedMessage, byte[] iv)
{
using (Aes aes = new AesCryptoServiceProvider())
{
aes.Key = bobKey;
aes.IV = iv;
// Decrypt the message
using (MemoryStream plaintext = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(plaintext, aes.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(encryptedMessage, 0, encryptedMessage.Length);
cs.Close();
string message = Encoding.UTF8.GetString(plaintext.ToArray());
Console.WriteLine(message);
}
}
}
}
}
감사합니다. Chochos. 성공적으로 Bouncy Castle 라이브러리를 사용했습니다. 그래도 문서를 찾는 것이 어려웠습니다! :) – Hemant
C#의 마지막 릴리스는 2011 년 4 월 7 일 Java 1.51, 2014 년 7 월 27 일입니다. C# 프로젝트의 경우 Bouncy Castle을 선호하지 않습니다. 누락 된 기능 및 유지 관리되지 않은 코드 때문입니다. –
C# 용 BouncyCastle의 ECC는 매우 느리며 타이밍 공격에 취약합니다. – CodesInChaos