私はC#で次のコードを持っています:
メインクラス
X509Certificate2 cert = new X509Certificate2("C:/test.pfx", "hello", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
Encryption enc = new Encryption();
string encrypted = enc.Encrypt("hello there", cert);
string decrypted = enc.Decrypt(encrypted, cert);
Console.WriteLine("Encrypted Text: " + encrypted);
Console.WriteLine("Decrypted Text: " + decrypted);
暗号化クラス
public string Encrypt(string plainText, X509Certificate2 cert)
{
RSACryptoServiceProvider publicKey = (RSACryptoServiceProvider)cert.PublicKey.Key;
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
byte[] encryptedBytes = publicKey.Encrypt(plainBytes, false);
string encryptedText = encryptedBytes.ToString();
return encryptedText;
}
public string Decrypt(string encryptedText, X509Certificate2 cert)
{
RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider)cert.PrivateKey;
byte[] encryptedBytes = Encoding.UTF8.GetBytes(encryptedText);
byte[] decryptedBytes = privateKey.Decrypt(encryptedBytes, false);
string decryptedText = decryptedBytes.ToString();
return decryptedText;
}
ご覧のとおり、メイン クラスで証明書をインポートしています。次に、Encryption クラスのインスタンスを作成しています。次に、暗号化されたテキストを取得するために、プレーンテキストを証明書と共に Encrypt メソッドに渡します。その後、暗号化されたテキストを Decrypt メソッドに渡して、プレーンテキストを取得します。
私の問題は、暗号化されたテキストを出力した結果が System.[]Byte になることです (復号化呼び出しをコメントアウトした場合)。復号化呼び出しをコメントアウトしないと、復号化メソッドで暗号化例外: 不正なデータが発生します。
encryptedBytes 配列が文字列に正しく変換されていないと思います。さらに、RSAEncryptionProvider を正しく形成しているかどうかもわかりません。どうすればこれを解決できますか?
アップデート
1つの問題を解決しました。バイト配列から文字列に変換するときは、Encoding.UTF8.GetString(EncryptedBytes) を使用する必要がありました。ここでの問題は、復号化メソッドが別の暗号化例外を与えていることです (復号化されるデータは、このモジュラスの最大値である 128 バイトを超えています)。
なぜこれが起こっているのか、それを解決する方法を知っている人はいますか?