C# - 使用第三方公钥加密发送给第三方的数据

时间:2011-11-09 17:50:40

标签: c# sql encryption rsacryptoserviceprovider

我被赋予了加密数据的任务,这些数据将存储在我们的数据库中并发送给我们的客户。我认为最好的方法是使用不对称加密,这样一旦我们用客户的公钥加密它,但客户(私钥的所有者)将能够解密它。

我想在我们的数据库中存储客户的公钥,算法类型(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. 有人可能有的任何其他指示。

1 个答案:

答案 0 :(得分:1)

RSA和其他非对称算法不适合批量加密数据。最大消息长度比密钥模数小几个字节。当然,您可以将数据形成块并重复应用RSA加密,但这仍然非常慢。相反,RSA用于交换对称密码的加密密钥。

我建议您使用S / MIME加密客户的数据。这是一个经过广泛审查以确保安全性的标准,您可能已经拥有了一个支持该协议的库。大多数电子邮件客户端都支持S / MIME,因此您的客户可能已经拥有他们需要的软件。

S / MIME(和PGP)通过为AES之类的对称密码(“内容加密密钥”)生成密钥来工作。这用于加密消息。然后,使用公共RSA密钥(每个接收者的“密钥加密密钥”)对该对称密钥进行加密。加密的内容加密密钥与密文一起发送给每个收件人。