2017-01-29 14 views
-1

Размер увеличивается, если прочитанные байты зашифрованы.Длина буфера растет в поточном шифре

Как найти значение байтов, которое я прочитал, когда пытаюсь расшифровать.

Например:

BufferLengh: 8192

После шифрования: 8208

Разность 16 байт там не зафиксировано.

Как я могу сделать этот процесс стабильным я с нетерпением жду ваших различных решений и рекомендаций

Шифрование Функция:

using (FileStream TEMPFILE = new FileStream(FILE_FULL_NAME, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, BUFFER_SIZE, FileOptions.DeleteOnClose)) 
{ 
    int BUFFER_SIZE=8192; 
    byte[] buffer = new byte[BUFFER_SIZE]; 

    while ((bytesRead = FILE_ORGINAL.Read(buffer, 0, BUFFER_SIZE)) > 0) 
    { 
     byte[] cryp = EN_Crypto_AES(buffer); 

     //encryp lenth : 8208 
     //BUFFER_SIZE : 8192 
     //---------------------- 
     //Crypto   +16 byte 

     TEMPFILE.Write(cryp, 0, cryp.Length); 
    } 

    TEMPFILE.Position = 0; 
    TEMPFILE.CopyTo(FILE_ORGINAL); 
} 

дешифрования Функция

using (FileStream TEMPFILE = new FileStream(FILE_FULL_NAME, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, BUFFER_SIZE, FileOptions.DeleteOnClose)) 
{ 
    int BUFFER_SIZE=8192; 

    byte[] buffer = new byte[BUFFER_SIZE]; 

    while ((bytesRead = FILE_ORGINAL.Read(buffer, 0, BUFFER_SIZE)) > 0) 
    { 
     byte[] cryp = DE_Crypto_AES(buffer); //16 byte ? 

     TEMPFILE.Write(cryp, 0, cryp.Length); 
    } 

    TEMPFILE.Position = 0; 
    TEMPFILE.CopyTo(FILE_ORGINAL); 
} 

EDIT

Другой класс

byte[] passwordBytes; 

public byte[] EN_Crypto_AES(byte[] bytesToBeEncrypted) 
{ 
    byte[] encryptedBytes = null; 

    byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; 

    using (MemoryStream ms = new MemoryStream()) 
    { 
     using (RijndaelManaged AES = new RijndaelManaged()) 
     { 
      AES.KeySize = 256; 
      AES.BlockSize = 128; 

      var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000); 
      AES.Key = key.GetBytes(AES.KeySize/8); 
      AES.IV = key.GetBytes(AES.BlockSize/8); 

      AES.Mode = CipherMode.CBC; 

      using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write)) 
      { 
       cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length); 
       cs.Close(); 
      } 
      encryptedBytes = ms.ToArray(); 
     } 
    } 

    return encryptedBytes; 
} 
public byte[] DE_Crypto_AES(byte[] bytesToBeDecrypted) 
{ 
    byte[] decryptedBytes = null; 

    // Set your salt here, change it to meet your flavor: 
    // The salt bytes must be at least 8 bytes. 
    byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; 

    using (MemoryStream ms = new MemoryStream()) 
    { 
     using (RijndaelManaged AES = new RijndaelManaged()) 
     { 
      AES.KeySize = 256; 
      AES.BlockSize = 128; 

      var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000); 
      AES.Key = key.GetBytes(AES.KeySize/8); 
      AES.IV = key.GetBytes(AES.BlockSize/8); 

      AES.Mode = CipherMode.CBC; 

      using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write)) 
      { 
       cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length); 
       cs.Close(); 
      } 
      decryptedBytes = ms.ToArray(); 
     } 
    } 

    return decryptedBytes; 
} 
+0

Вам нужно будет опубликовать код для 'EN_Crypto_AES'. –

ответ

0

AES не является потоковый шифр, он может быть использован в качестве потокового шифра в режиме CTR.

Дополнительные байты заполняются. См. PKCS#7 padding.

Блочные шифры требуют ввода, чтобы быть точным кратным размеру блока, как правило, это достигается с помощью дополнения PKCS # 7. Указывая заполнение (много раз по умолчанию), байты заполнения автоматически добавляются во время шифрования и удаляются при расшифровке.

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

+0

Спасибо. Я знаю, что это стандартные 16 байт. Это просто пример. Как разрешить операцию в этой логике? – mcxxx

+0

AES не является потоковым шифром в режиме CBC. В чем проблема с добавлением байтов заполнения? – zaph

+0

Я не могу расшифровать проблему – mcxxx