C # - Использовать открытый ключ третьих сторон для шифрования данных, отправленных третьей стороне - PullRequest
1 голос
/ 09 ноября 2011

Мне было поручено зашифровать данные, которые будут храниться в нашей базе данных и отправлены одному из наших клиентов.Я подумал, что лучший способ сделать это - использовать асимметричное шифрование, чтобы после того, как мы зашифровали его с помощью открытого ключа нашего клиента, никто, кроме клиента (владельца закрытого ключа), не сможет его расшифровать.Я хотел бы хранить открытый ключ нашего клиента, тип алгоритма (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 Ответ

1 голос
/ 09 ноября 2011

RSA и другие асимметричные алгоритмы не подходят для массового шифрования данных. Максимальная длина сообщения на несколько байтов меньше, чем модуль ключа. Конечно, вы можете сформировать данные в блоки и повторно применять шифрование RSA, но это все еще ужасно медленно. Вместо этого RSA используется для обмена ключами шифрования на симметричный шифр.

Я рекомендую вам использовать S / MIME для шифрования данных ваших клиентов. Это стандарт, который был широко рассмотрен для безопасности, и у вас, вероятно, уже есть библиотека для поддержки протокола. Большинство почтовых клиентов поддерживают S / MIME, поэтому ваши клиенты, вероятно, уже имеют необходимое программное обеспечение.

S / MIME (и PGP) работают путем генерации ключа для симметричного шифра, такого как AES - «ключ шифрования контента». Это используется для шифрования сообщения. Затем этот симметричный ключ шифруется с помощью открытого ключа RSA - «ключа шифрования» - каждого получателя. Зашифрованный ключ шифрования содержимого отправляется вместе с зашифрованным текстом каждому получателю.

...