Сколько символов создать байтовый массив для моего метода AES? - PullRequest
4 голосов
/ 29 июня 2009

Я использую методы AES здесь: http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.aspx

Я хочу получить строковое значение, которое я преобразую в байтовый массив и передам в метод шифрования AES. Сколько символов должно быть в строке, чтобы получить правильный размер байтового массива, ожидаемый методом?

static byte[] encryptStringToBytes_AES(string plainText, byte[] Key, byte[] IV)
    {
        // Check arguments.
        if (plainText == null || plainText.Length <= 0)
            throw new ArgumentNullException("plainText");
        if (Key == null || Key.Length <= 0)
            throw new ArgumentNullException("Key");
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException("Key");

        // Declare the stream used to encrypt to an in memory
        // array of bytes.
        MemoryStream msEncrypt = null;

        // Declare the RijndaelManaged object
        // used to encrypt the data.
        RijndaelManaged aesAlg = null;

        try
        {
            // Create a RijndaelManaged object
            // with the specified key and IV.
            aesAlg = new RijndaelManaged();
            aesAlg.Key = Key;
            aesAlg.IV = IV;

            // Create a decrytor to perform the stream transform.
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            // Create the streams used for encryption.
            msEncrypt = new MemoryStream();
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {

                    //Write all data to the stream.
                    swEncrypt.Write(plainText);
                }
            }

        }
        finally
        {

            // Clear the RijndaelManaged object.
            if (aesAlg != null)
                aesAlg.Clear();
        }

        // Return the encrypted bytes from the memory stream.
        return msEncrypt.ToArray();

    }

Ответы [ 3 ]

6 голосов
/ 29 июня 2009

Размер простого текста не имеет значения. Просто убедитесь, что вы используете те же IV и Key вместе с зашифрованными байтами в методе decryptStringFromBytes_AES (byte [] cipherText, byte [] Key, byte [] IV). Это вернет вам введенный простой текст.

Например:


string plain_text = "Cool this works";
byte[] iv = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
                                           0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
byte[] key = new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
                                           0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
byte[] encrytped_text = encryptStringToBytes_AES(plain_text, key, iv);
string plain_text_again = decryptStringFromBytes_AES(encrypted_text, key, iv);

Здесь вы должны увидеть, что обычный текст и обычный текст снова совпадают. Теперь измените plain_text на все, что вы хотите, и убедитесь, что это работает нормально.

Значения по умолчанию для RijndaelManaged:
Размер блока: 128
Размер ключа: 256
Режим: CipherMode.CBC
Padding: PaddingMode.PKCS7

Действительные размеры IV:
128, 192, 256 бит (это BlockSize, убедитесь, что вы установили размер IV, который вы используете)
Действительные размеры ключа:
128, 192, 256 бит (это KeySize, убедитесь, что вы установили размер ключа, который вы используете)

Это означает, что byte [] iv может быть 16, 24 или 32 байта (в моем примере выше это 16 байтов), а ключ byte [] также может быть 16, 24 или 32 байта (в моем примере выше) его 16 байтов).

Надеюсь, это поможет.

0 голосов
/ 29 июня 2009

Не преобразовывать строку в ее байтовое представление Unicode. Будет слишком сложно проверить правильность длины и не обеспечить достаточную рандомизацию.

Вы можете сделать следующее: использовать функцию получения ключа . Вам нужен байтовый массив фиксированной длины для ввода функции. Это то, что Rfc2898 лучше всего.

Итак, создайте новый объект Rfc2898:

using PBKDF2 = System.Security.Cryptography.Rfc2898DeriveBytes;

class Example {
    byte[] mySalt = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };

    void Initialize( string password ) {
        PBKDF2 kdf = new PBKDF2( password, mySalt );
        // Then you have your algorithm
        // When you need a key: use:
        byte[] key = kdf.GetBytes( 16 ); // for a 128-bit key (16*8=128)

        // You can specify how many bytes you need. Same for IV.
        byte[] iv = kdf.GetBytes( 16 ); // 128 bits again.

        // And then call your constructor, etc.
        // ...
    }
}

В качестве примера того, как я это использовал, посмотрите мой проект с использованием Rijndael . У меня есть шаг пароля, где я беру строку и получаю ключ и массив байтов iv, используя вышеописанный метод.

0 голосов
/ 29 июня 2009

Для этого вам нужно заполнить. На самом деле, на странице, на которую вы ссылаетесь, есть пример заполнения (на C ++).

С заполнителями вы можете зашифровать блоки нестандартных размеров.

...