1

私は、データベースに保存され、顧客の 1 人に送信されるデータを暗号化するタスクを与えられました。これを行う最善の方法は、非対称暗号化を使用することであると考えました。これにより、顧客の公開鍵で暗号化すると、顧客 (秘密鍵の所有者) 以外は復号化できなくなります。

顧客の証明書を管理する代わりに、顧客の公開鍵、アルゴリズムの種類 (RSA または DSA)、および有効期限をデータベースに保存したいと考えています。問題は、公開鍵をどのように保存して使用できるかです。テスト用に次の小さなプログラムを作成しましたが、問題が発生しています。

class Program
{

    static void Main(string[] args)
    {
        const string publicKeyString = "30 81 89 02 81 81 00 c2 6e 7e e8 78 66 3d 74 fd a7 57 21 24 2d c0 ee 53 59 54 14 db f5 cb 5e 8c 64 c8 73 d5 83 d7 12 57 3f e2 92 54 9a 87 94 18 71 04 c8 b5 92 44 27 78 e9 d3 de cb 5f f6 93 75 c0 46 6b 50 c7 45 a8 38 f9 a1 83 8e 26 51 5a 8c 22 95 8e 2b 4c 10 ea c6 85 ed 02 ed 66 81 ef a3 55 15 ad 64 33 d3 bd ca 75 db 35 44 49 54 ef 6a ca 2a d5 90 a7 9b be 03 40 62 16 fd be 39 fb b6 f0 6b f8 f1 00 c0 c5 02 03 01 00 01";
        const string stringToEncrypt = "11111111111111111111";

        var encoding = new UTF8Encoding();
        var encryptedData = Encrypt(encoding.GetBytes(stringToEncrypt), encoding.GetBytes(publicKeyString));

        Console.WriteLine("**** Encrypted String ****");
        Console.WriteLine(encoding.GetString(encryptedData));

        var decryptedData = Decrypt(encryptedData);

        Console.WriteLine("**** Decrypted String ****");
        Console.WriteLine(encoding.GetString(decryptedData));

        Console.ReadKey();


    }

    static byte[] Encrypt(byte[] dataToEncrypt, byte[] publicKey)
    {

        var exponent = new byte[] { 1, 0, 1 };
        var rsa = new RSACryptoServiceProvider();
        rsa.ImportParameters(new RSAParameters() { Modulus = publicKey, Exponent = exponent });
        var encryptedData = rsa.Encrypt(dataToEncrypt, false);
        return encryptedData;
    }

    static byte[] Decrypt(byte[] dataToDecrypt)
    {
        var cert = new X509Certificate2(@"C:\certs\BP_DEV_CERT_1024.p12", "password");
        var rsa = (RSACryptoServiceProvider) cert.PrivateKey;
        var decryptedData = rsa.Decrypt(dataToDecrypt, false);
        return decryptedData;

    }

}

このプログラムを実行すると、「復号化するデータが、このモジュラスの最大値である 128 バイトを超えています」というメッセージが表示されます。これにより、使用する公開鍵を準備する方法が完全に間違っていると思います。

だから私はいくつかのことを知る必要があると思います:

  1. 証明書から公開鍵をコピーできますが、データベースにどのように保存すればよいですか?

  2. 公開鍵文字列を適切なバイト配列に適切に変換するにはどうすればよいですか?

  3. 誰かが持っているかもしれない他の指針。

4

1 に答える 1

1

RSA およびその他の非対称アルゴリズムは、データの一括暗号化には適していません。メッセージの最大長は、鍵のモジュラスよりも数バイト短くなります。もちろん、データをブロックに形成し、RSA 暗号化を繰り返し適用することもできますが、それでも恐ろしく遅くなります。代わりに、対称暗号の暗号化キーを交換するために RSA が使用されます。

S/MIME を使用して顧客のデータを暗号化することをお勧めします。これは、セキュリティに関して広くレビューされている標準であり、おそらく、プロトコルをサポートするライブラリが既にあるでしょう。ほとんどの電子メール クライアントは S/MIME をサポートしているため、顧客は必要なソフトウェアを既に持っている可能性があります。

S/MIME (および PGP) は、AES のような対称暗号 (「コンテンツ暗号化キー」) のキーを生成することによって機能します。これは、メッセージを暗号化するために使用されます。次に、その対称キーは、各受信者の公開 RSA キー (「キー暗号化キー」) で暗号化されます。暗号化されたコンテンツ暗号化キーは、暗号文とともに各受信者に送信されます。

于 2011-11-09T19:08:35.583 に答える