0

C#でメッセージを暗号化および復号化するコードを以下に示します。実行しようとすると、例外が発生します。つまり、「復号化するデータが、このモジュラスの 256 バイトの最大値を超えています」

 public static void Main(string[] args)
    {
        X509Certificate2 cert = new X509Certificate2(@"C:\Data\ABC-rsa-public-key-certificate.cer");
        string encryptedText = EncrypIt("Hello", cert);
        string decryptedText = DecrptIt(encryptedText, cert);
        System.Console.WriteLine(decryptedText);


    }

    public static string EncrypIt(string inputString, X509Certificate2 cert)
    {
        RSACryptoServiceProvider publicKey = (RSACryptoServiceProvider)cert.PublicKey.Key;
        byte[] plainBytes = Encoding.UTF8.GetBytes(inputString);
        byte[] encryptedBytes = publicKey.Encrypt(plainBytes, false);
        string encryptedText = Encoding.UTF8.GetString(encryptedBytes);
        return encryptedText;      
    }

    public static string DecrptIt(string encryptedText, X509Certificate2 cert)
   {
       RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider)cert.PublicKey.Key;
       byte[] encryptedBytes = Encoding.UTF8.GetBytes(encryptedText);
       byte[] decryptedBytes = privateKey.Decrypt(encryptedBytes, false);
       string decryptedText = Encoding.UTF8.GetString(decryptedBytes);
       return decryptedText;
   }
4

2 に答える 2

5

いくつかの問題:

  1. デフォルトでは、RSA は 1 つのブロックのみを暗号化します。長いメッセージには適していません。メッセージ自体を RSA で暗号化しないでください。ランダムな AES キーを生成し、キーを RSA で暗号化し、実際のメッセージを AES で暗号化します。

  2. 暗号文には、Hex や Base64 などの安全なバイナリ エンコーディングを使用する必要があります。UTF-8 を使用すると、任意のバイト シーケンスが許可されないため、データが破損します。

    UTF-8 はテキストをエンコードするように設計されているため、平文には問題ありません。

  3. OAEP を使用してください。古い 1.5 パディング モードは安全ではありません。つまりtrue、2 番目のパラメーターとしてEncrypt/に渡しますDecrypt(技術的には安全に使用できますが、トリッキーなのでお勧めしません)


さらに注意すると、AES を使用すると、いくつかの落とし穴があります。各メッセージ

于 2013-09-20T15:45:14.900 に答える