椭圆曲线加密的.NET实现(库)
你能建议在.NET平台上使用椭圆曲线加密的任何实现吗 此外,如果您已经使用了它们,您能告诉我应该使用的推荐曲线吗 [编辑]椭圆曲线加密的.NET实现(库),.net,encryption,cryptography,public-key-encryption,elliptic-curve,.net,Encryption,Cryptography,Public Key Encryption,Elliptic Curve,你能建议在.NET平台上使用椭圆曲线加密的任何实现吗 此外,如果您已经使用了它们,您能告诉我应该使用的推荐曲线吗 [编辑] 正如@FatCat所提到的,其实现在.NET framework 3.5中可用,但仅在windows vista上可用。您能推荐另一种方法/库来使用它吗?该.NET Framework已经包括Diffie Hellman,这是一种椭圆曲线加密算法。看看下面 通常使用ECC进行加密的方法是使用“短暂的静态Diffie-Hellman” 它是这样工作的: 获取预期接收者的公钥
正如@FatCat所提到的,其实现在.NET framework 3.5中可用,但仅在windows vista上可用。您能推荐另一种方法/库来使用它吗?该.NET Framework已经包括Diffie Hellman,这是一种椭圆曲线加密算法。看看下面 通常使用ECC进行加密的方法是使用“短暂的静态Diffie-Hellman” 它是这样工作的:
- 获取预期接收者的公钥(可能来自证书)。这是静态键
- 生成临时ECDH密钥对。这是短暂的钥匙对
- 使用密钥生成共享对称密钥
- 使用对称密钥加密数据
- 将加密数据与临时密钥对中的公钥一起传输
伟大的我试过了,但找不到如何使用它来加密邮件。似乎没有任何“加密”功能…框架3.5中新类的文档很糟糕。哦,现在我意识到这只适用于Windows Vista。Cng后缀意味着加密工作被卸载到Windows Cng(crypto下一代)中,这在Windows Vista和更高版本中是有用的。赫曼特:框架3.5的文档还不错;你知道迪菲·赫尔曼是什么吗?它本身不用于加密,而是用于从使用公钥加密(包括RSA或EC)的双方获得一个用于对称密码的秘密共享密钥。@Hemant ECDH是一个密钥交换系统,您可以使用它来获得对称密钥进行加密感谢Chochos。我已经成功地使用了Bouncy Castle图书馆。不过,找到文档并不难!:)c#的最新版本是2011年4月7日的1.7版,Java 1.51的最新版本是2014年7月27日。对于c#项目,我不喜欢Bounchy Castle,因为缺少功能,也没有维护代码。请注意,c#的BounchyCastle中的ECC非常慢,可能容易受到定时攻击。@CodesInChaos您在与ECC相关的不同问题上多次提到过这一点。既然您似乎对这方面的密码学很在行,您能为C#推荐一个替代库吗?我希望实现一个DKG协议,即用于构造密文的密钥是多方公钥的集合??(远程受信任节点)和ECC似乎是这方面的一个整体要求。您提供的链接不再指向预期的文档。相反,它会将您带到blackberry.certicom.com页面。
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);
}
}
}
}
}