2015-03-20 16 views
1

Из моей команды безопасности они хотят, чтобы я использовал силу ключа AES256 и режим CBC. Мой код работает только тогда, когда я ввожу вводный текст из 32 букв в длину теперь после смены на 256 CBC и размером блока до 128.Шифрование AES 256 Input Plaintext Length Issue

Если я введу «Это тест» (длиной не 32 символа), я получаю:

System.Security.Cryptography.CryptographicException: входные данные не являются полным блоком.

Если я вхожу: «ABCDEFGHIJKLMNOPQRSTUVWXYZ000000», работает!

Какой код мне нужен, чтобы эта работа выполнялась с использованием «Это тест» в качестве входных данных.

код ниже:

public byte[] EncryptStringToByte(string plainText, byte[] key, byte[] vector) 
{    
byte[] encrypted;     
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider()) 
{ 
    aes.BlockSize = 128; 
    aes.KeySize = 256; 
    aes.Mode = CipherMode.CBC; 
    aes.Padding = PaddingMode.None; 
    aes.Key = key; 
    aes.IV = vector; 

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

    // Create the streams used for encryption. 
    using (MemoryStream 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); 
      } 
      encrypted = msEncrypt.ToArray(); 
     } 
    } 
    } 
// Return the encrypted bytes from the memory stream. 
return encrypted; 
} 

ответ

3

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

Обычный режим, используемый для блочных шифров является PKCS # 5/PKCS # 7:

aes.Padding = PaddingMode.PKCS7;