C# で RSA を使用してデータを暗号化および復号化しようとしています。次の MSTest 単体テストがあります。
const string rawPassword = "mypass";
// Encrypt
string publicKey, privateKey;
string encryptedPassword = RSAUtils.Encrypt(rawPassword, out publicKey, out privateKey);
Assert.AreNotEqual(rawPassword, encryptedPassword,
"Raw password and encrypted password should not be equal");
// Decrypt
string decryptedPassword = RSAUtils.Decrypt(encryptedPassword, privateKey);
Assert.AreEqual(rawPassword, decryptedPassword,
"Did not get expected decrypted password");
復号化中に失敗しますが、たまにしかありません。ブレークポイントを設定してテストを実行すると、パスするようです。これにより、復号化が正常に行われるのに間に合うように何かが終了していないのではないかと考え、デバッグ中にステップスルーを遅くすると、完了するのに十分な時間が与えられました. 失敗した場合、失敗したと思われる行decryptedBytes = rsa.Decrypt(bytesToDecrypt, false);
は次のメソッドにあります。
public static string Decrypt(string textToDecrypt, string privateKeyXml)
{
if (string.IsNullOrEmpty(textToDecrypt))
{
throw new ArgumentException(
"Cannot decrypt null or blank string"
);
}
if (string.IsNullOrEmpty(privateKeyXml))
{
throw new ArgumentException("Invalid private key XML given");
}
byte[] bytesToDecrypt = ByteConverter.GetBytes(textToDecrypt);
byte[] decryptedBytes;
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(privateKeyXml);
decryptedBytes = rsa.Decrypt(bytesToDecrypt, false); // fail here
}
return ByteConverter.GetString(decryptedBytes);
}
次の例外で失敗します。
System.Security.Cryptography.CryptographicException: 不正なデータ
私のEncrypt
方法は次のとおりです。
public static string Encrypt(string textToEncrypt, out string publicKey,
out string privateKey)
{
byte[] bytesToEncrypt = ByteConverter.GetBytes(textToEncrypt);
byte[] encryptedBytes;
using (var rsa = new RSACryptoServiceProvider())
{
encryptedBytes = rsa.Encrypt(bytesToEncrypt, false);
publicKey = rsa.ToXmlString(false);
privateKey = rsa.ToXmlString(true);
}
return ByteConverter.GetString(encryptedBytes);
}
ByteConverter
全体で使用される は、次のとおりです。
public static readonly UnicodeEncoding ByteConverter = new UnicodeEncoding();
.NET を使用した RSA 暗号化と復号化に関する StackOverflow に関するいくつかの質問を見てきました。 これは、秘密鍵で暗号化し、公開鍵で復号化しようとしたことが原因でしたが、私はそうしているとは思いません。 この質問には私と同じ例外がありますが、選択した回答は OpenSSL.NET を使用することでした。
私は何を間違っていますか?