公開/秘密キー暗号化を使用して、2 つのエンドポイントが相互に安全に通信できるシナリオを実装したいと考えています。シナリオは次のとおりです。
A が B にメッセージを送信するには:
A は、A の秘密鍵を使用してメッセージを暗号化します。
A は、B の公開鍵を使用してメッセージを暗号化します。
A がメッセージを送信します。
Bはメッセージを受け取ります。
B は、A の公開鍵を使用してメッセージを復号化します。
B は、B の秘密鍵を使用してメッセージを復号化します。
B はメッセージを読み上げます。
RSA暗号化を使用してC#にあるものは次のとおりです。
// Alice wants to send a message to Bob:
String plainText = "Hello, World!";
Byte[] plainData = Encoding.Default.GetBytes(plainText);
Byte[] cipherData = null;
RSACryptoServiceProvider alice = new RSACryptoServiceProvider();
RSACryptoServiceProvider bob = new RSACryptoServiceProvider();
var alicePrivateKey = alice.ExportParameters(true);
var alicePublicKey = alice.ExportParameters(false);
var bobPrivateKey = bob.ExportParameters(true);
var bobPublicKey = bob.ExportParameters(false);
RSACryptoServiceProvider messenger = new RSACryptoServiceProvider();
messenger.ImportParameters(alicePrivateKey);
cipherData = messenger.Encrypt(plainData, true);
messenger.ImportParameters(bobPublicKey);
cipherData = messenger.Encrypt(cipherData, true);
messenger.ImportParameters(alicePublicKey);
cipherData = messenger.Decrypt(cipherData, true);
messenger.ImportParameters(bobPrivateKey);
cipherData = messenger.Decrypt(cipherData, true);
String result = Encoding.Default.GetString(alice.Decrypt(cipherData, true));
明らかに、次の行に何か問題があります。
messenger.ImportParameters(bobPublicKey);
cipherData = messenger.Encrypt(cipherData, true);
メッセージ{ "Bad Length" }でSystem.Security.Cryptography.CryptographyExceptionをスローします。
ご覧のとおり、ボブのキーの公開部分だけを使用してデータを暗号化することはできません。
C#でやりたいことを適切に達成する方法について、誰かが光を当てることができますか?