.NETプラットフォームで使用する楕円曲線暗号の実装をお勧めしますか?楕円曲線暗号の.NET実装(ライブラリ)
また、使用した場合は、使用すべき推奨カーブを教えてください。
[EDIT]
@FatCatが述べたように、その実装は、.NET Framework 3.5で提供されていますが、それは、Windows Vistaでのみ使用可能です。あなたはそれを使用する別の方法/ライブラリをお勧めしますか?
.NETプラットフォームで使用する楕円曲線暗号の実装をお勧めしますか?楕円曲線暗号の.NET実装(ライブラリ)
また、使用した場合は、使用すべき推奨カーブを教えてください。
[EDIT]
@FatCatが述べたように、その実装は、.NET Framework 3.5で提供されていますが、それは、Windows Vistaでのみ使用可能です。あなたはそれを使用する別の方法/ライブラリをお勧めしますか?
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);
}
}
}
}
}
Thanks Chochos。私はBouncy Castleライブラリをうまく使用しました。しかし、ドキュメンテーションを見つけるのは少し難しかった! :) – Hemant
C#の最終リリースは2011年4月7日、Java 1.51、2014年7月27日です。C#プロジェクトでは、Bouncy Castleは機能がなく、コードが維持されていないため、好きではありません。 –
C#のBouncyCastleのECCは非常に遅く、タイミング攻撃に対して脆弱である可能性があることに注意してください。 – CodesInChaos