6
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace EncryptionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            UnicodeEncoding ByteConverter = new UnicodeEncoding();

            byte[] dataToEncrypt = ByteConverter.GetBytes("Test data");

            string enc = Encrypt(dataToEncrypt);         
        }

        static string Encrypt(byte[] data)
        {
            UnicodeEncoding ByteConverter = new UnicodeEncoding();
            RSACryptoServiceProvider encrypt = new RSACryptoServiceProvider();

            byte[] encryptedData = encrypt.Encrypt(data, false); //Repeat this line

            return ByteConverter.GetString(encryptedData);
        }

    }
}

「次のステートメントを設定」を使用して、次のステートメントを繰り返し実行しました。つまり、他のコード行を実行しませんでした。 byte[] encryptedData = encrypt.Encrypt(data, false);

encryptedData のバイトを調べたところ、encryptedData のバイトが毎回変化することがわかりました。さすがにこれはまずい?公開鍵が変更されておらず、暗号化されるデータが変更されていない場合、「encryptedData」バイトも変更されるべきではありませんか?

4

1 に答える 1

5

いいえ、意図したとおりに機能しています。Encrypt を呼び出すたびに、ランダムなオクテットを使用してプレーン テキストを暗号化するパディング スキームを使用するため、暗号化されたデータは毎回変更されます。Decrypt(Encrypt(data))重要なのは、元のバイト配列を返すかどうかだけですdata

RSAを安全にするには、RSA パディング ( OAEP または PKCS#1 v1.5 互換のパディング) が必要です。また、パディングのランダムな部分により、プレーン テキストを複数回暗号化したときに返される暗号文が確実に区別されます。これは重要なセキュリティ要件です。攻撃者は、繰り返しを探すだけでプレーン テキストに関する情報を見つけることができてはなりません。

于 2012-02-08T13:38:31.627 に答える