私は、データベースに保存され、顧客の 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 バイトを超えています」というメッセージが表示されます。これにより、使用する公開鍵を準備する方法が完全に間違っていると思います。
だから私はいくつかのことを知る必要があると思います:
証明書から公開鍵をコピーできますが、データベースにどのように保存すればよいですか?
公開鍵文字列を適切なバイト配列に適切に変換するにはどうすればよいですか?
誰かが持っているかもしれない他の指針。