Шифрование - симметричный ключ - PullRequest
1 голос
/ 13 сентября 2011

Я использую Rijndael (как алгоритм AES) для шифрования. Я зашифровываю значения (свойства объектов) и сериализую объект для xml и отправки xml получателю через веб-сервис. Я хочу передать зашифрованный симметричный ключ, который я использовал для шифрования данных. Но какой ключ я должен передать? Мой алгоритм расшифровки выглядит следующим образом (vb.net):

Public Function Encrypt(ByVal stringToEncrypt As String) As String

    Dim textConverter As New ASCIIEncoding()
    Dim myRijndael As New RijndaelManaged()
    Dim encrypted() As Byte
    Dim stringToEncryptAsByte() As Byte
    Dim encryptedAsString As String
    Dim key() As Byte
    Dim IV() As Byte

        ' Set symetric key size og chiper mode
        myRijndael.Mode = CipherMode.CBC
        myRijndael.KeySize = 128

        ' Create a new key and initialization vector.
        myRijndael.GenerateKey()
        myRijndael.GenerateIV()

        ' Get the key and IV.
        key = myRijndael.Key
        IV = myRijndael.IV

        ' Get an encryptor.
        Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV)

        ' Encrypt the data.
        Dim msEncrypt As New MemoryStream()
        Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)

        ' Convert the data to a byte array.
        stringToEncryptAsByte = textConverter.GetBytes(stringToEncrypt)

        ' Write all data to the crypto stream and flush it.
        csEncrypt.Write(stringToEncryptAsByte, 0, stringToEncryptAsByte.Length)
        csEncrypt.FlushFinalBlock()

        ' Get encrypted array of bytes.
        encrypted = msEncrypt.ToArray()
        encryptedAsString = Convert.ToBase64String(encrypted)

        Return encryptedAsString
End Function

Если я хочу расшифровать зашифрованную строку, я должен использовать и ключ, и IV, но я думаю, что должен передать только значение ключа. Должен ли я сделать это по-другому или что я должен пройти? Моя спецификация говорит, что значения должны быть зашифрованы с использованием AES и 128-битного ключа.

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

IV прост, просто отправьте его как есть.Обычной практикой является добавление его к зашифрованному тексту, чтобы получатель просто удалял его при необходимости.Не нужно хранить секрет IV.

Ключ не так прост, потому что он должен храниться в секрете.Существует два основных решения:

  1. Используйте Диффи-Хеллмана для согласования нового секретного ключа с получателем каждый раз, когда вам нужно отправить им зашифрованный файл.

  2. Используйте их открытый ключ RSA, чтобы зашифровать ключ AES и отправить его им таким образом.

Возможно, вы также захотите исследовать использование HMAC, чтобы убедиться, что файл имеетне был подделан во время передачи.

1 голос
/ 13 сентября 2011

Если вы передаете ключ шифрования вместе с зашифрованными данными, это равносильно тому, что вы вообще не шифруете данные (кроме тех, которые не могут прочитать их простыми глазами, но тогда простая кодировка Base64 или аналогичная будет делать то же самое .

Чтобы использовать алгоритм симметричного шифрования, отправитель и получатель должны иметь общий секретный ключ (симметричный ключ или что-то, из чего ключ может быть получен). Если это невозможно, вы можете использовать гибридную симметричную / асимметричную схему шифрования: здесь отправитель шифрует секретный ключ с использованием алгоритма открытого ключа и отправляет его вместе с симметрично зашифрованными данными. (В этом случае отправитель должен знать открытый ключ, соответствующий закрытому ключу получателя.)

При этом в режимах работы цепочки для блочных шифров (например, CBC) отправитель обычно передает вектор инициализации вместе с данными.

...