Какова длина зашифрованного текста для шифрования AES с использованием C #? - PullRequest
0 голосов
/ 07 марта 2019

От: Можем ли мы вычислить длину зашифрованного текста AES на основе длины открытого текста?

Я вижу: output_size = input_size + (16 - (input_size% 16))

Но это, похоже, не соответствует тому, что я вижу при запуске тестов с использованием C # и AesCng с заполнением PKCS7 и CBC CipherMode.

Мысли о том, как рассчитать длину зашифрованного значения?

Вот код для примера программы:

Public Shared Function Encrypt(ByVal plainText As String, ByVal aes256BitKeyValue As String, ByVal initialVector As String) As String

  If String.IsNullOrEmpty(plainText) Then
    Return String.Empty
  End If

  Dim initialVectorBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(initialVector)
  Dim plainTextBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(plainText)
  Dim cipherTextBytes As Byte() = Nothing

  Using symmetricKey As New System.Security.Cryptography.AesCng()
    symmetricKey.Padding = Security.Cryptography.PaddingMode.PKCS7
    symmetricKey.Mode = System.Security.Cryptography.CipherMode.CBC

    Dim keyBytes As Byte() = StringToByteArray(aes256BitKeyValue)

    Try

      Using cryptographyTransform As System.Security.Cryptography.ICryptoTransform = symmetricKey.CreateEncryptor(keyBytes, initialVectorBytes)
        Using memoryStream As New System.IO.MemoryStream()
          Using cryptographyStream As New System.Security.Cryptography.CryptoStream(memoryStream, cryptographyTransform, System.Security.Cryptography.CryptoStreamMode.Write)
            cryptographyStream.Write(plainTextBytes, 0, plainTextBytes.Length)
            cryptographyStream.FlushFinalBlock()
            cipherTextBytes = memoryStream.ToArray()
            memoryStream.Close()
            cryptographyStream.Close()
          End Using
        End Using
      End Using

    Catch ex As Exception
      Throw New Exceptions.EncryptionException(String.Format(System.Globalization.CultureInfo.InvariantCulture, Resources.ExceptionMessages.EncryptionFailed1, ex))

    Finally
      symmetricKey.Clear()
    End Try

  End Using

  Return Convert.ToBase64String(cipherTextBytes)

End Function

пространство имен ConsoleApplication1 {class Program {static void Main (string [] args) {string aes256Key = "1234567890123456789012345678901234567890123456789012345678901234";string initialVector = "66sDeG * 3xsS334dE";

  string unencrypted20Text = "12345678901234567890";
  string unencrypted40Text = "1234567890123456789012345678901234567890";
  string unencrypted64Text = "1234567890123456789012345678901234567890123456789012345678901234";
  string unencrypted128Text = "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678";
  string unencrypted256Text = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456";
  string unencrypted257Text = "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567";
  string unencrypted512Text = unencrypted256Text + unencrypted256Text;
  string unencrypted1024Text = unencrypted512Text + unencrypted512Text;
  string unencrypted2048Text = unencrypted1024Text + unencrypted1024Text;
  string unencrypted4096Text = unencrypted2048Text + unencrypted2048Text;
  string unencrypted8192Text = unencrypted4096Text + unencrypted4096Text;

  string encrypted20Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted20Text, aes256Key, initialVector);
  string encrypted40Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted40Text, aes256Key, initialVector);
  string encrypted64Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted64Text, aes256Key, initialVector);
  string encrypted128Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted128Text, aes256Key, initialVector);
  string encrypted256Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted256Text, aes256Key, initialVector);
  string encrypted257Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted257Text, aes256Key, initialVector);
  string encrypted512Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted512Text, aes256Key, initialVector);
  string encrypted1024Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted1024Text, aes256Key, initialVector);
  string encrypted2048Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted2048Text, aes256Key, initialVector);
  string encrypted4096Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted4096Text, aes256Key, initialVector);
  string encrypted8192Text = Grb.Core.Cryptography.AesEncryption.Encrypt(unencrypted8192Text, aes256Key, initialVector);

  int encrypted20TextLength = encrypted20Text.Length; // actual: 44, expected 20 + (16 - 4) = 32
  int encrypted40TextLength = encrypted40Text.Length; // actual: 64, expected 40 + (116 - 8) = 48
  int encrypted64TextLength = encrypted64Text.Length; // actual: 108, expected 64 + (16 - 0) = 80
  int encrypted128TextLength = encrypted128Text.Length; // actual: 192, expected 128 + (16 - 0) = 144
  int encrypted256TextLength = encrypted256Text.Length; // actual: 364 
  int encrypted257TextLength = encrypted257Text.Length; // actual: 364
  int encrypted512TextLength = encrypted512Text.Length; // actual: 704
  int encrypted1024TextLength = encrypted1024Text.Length; // actual: 1388
  int encrypted2048TextLength = encrypted2048Text.Length; // actual: 2752
  int encrypted4096TextLength = encrypted4096Text.Length; // actual: 5484
  int encrypted8192TextLength = encrypted8192Text.Length; // actual: 10944



}

}}

...