Скажи, что я знаю, что:

A) Некоторый обычный текст был зашифрован следующим 128-битным ключом: 7, 185,138,208,128,211,227,11,63,145,255,245,1,7,177,231

Б) Пустая строка ВСЕГДА шифруется до следующего base64: MEUxILm04F/S2qSIlJKdPQ==

C) Строка 662-862-4967 ВСЕГДА шифруется до следующего base64: Zu51CRz6DOsTiLc8KhP1Aw==

D) Вероятно, используется метод шифрования AES 128 с размером блока 128 бит.

Возможно ли (и/или прямолинейно) отказаться от IV, который использовался, если AES был реализован в режиме CBC?

Я пытался воссоздать зашифрованный текст MEUxILm04F/S2qSIlJKdPQ== (после base64) в .net, используя RijndaelManaged() в различных режимах и с (где применимо) разными простыми IV, такими как все нули, но я не могу воспроизвести.

Вот код, который я использую, чтобы попытаться зашифровать пустую строку, чтобы получить MEUxILm04F/S2qSIlJKdPQ== с вводом ключа, как указано выше (закомментированные строки — это то, что я пробовал):

Public Shared Function Encrypt(ByVal toEncrypt As String, ByVal keyArray As [Byte]()) As String

      Dim toEncryptArray As Byte() = UTF8Encoding.UTF8.GetBytes(toEncrypt)

      'Dim IV As Byte() = New Byte() {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
      Dim IV As Byte() = New Byte(15) {}

      Dim rDel As New RijndaelManaged()
      rDel.KeySize = 128
      rDel.BlockSize = 128

      rDel.IV = IV

      rDel.Key = keyArray
      'rDel.Mode = CipherMode.ECB   
      rDel.Mode = CipherMode.CBC

      rDel.Padding = PaddingMode.PKCS7
      'rDel.Padding = PaddingMode.Zeros

      Dim cTransform As ICryptoTransform = rDel.CreateEncryptor()
      Dim resultArray As Byte() = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length)
      Return Convert.ToBase64String(resultArray, 0, resultArray.Length)
   End Function
2
klz 22 Мар 2011 в 03:35

1 ответ

В режиме CBC IV подвергается операции XOR с открытым текстом до шифрования.

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

Однако ваш «128-битный ключ» кажется коротким на 8 бит, поэтому я не смог вычислить IV.

Я использовал следующие аргументы для OpenSSL:

echo 'MEUxILm04F/S2qSIlJKdPQ==' | \
openssl enc -d -base64 | \
openssl enc -d -aes-128-ecb -K 'B98AD080D3E30B3F91FFF50107B1E7'
0
jnic 25 Мар 2011 в 19:48
Я обновил ключ выше (отсутствовал 7 в качестве первого байта). Изучив это, я пришел к тому же выводу, что и вы, так что спасибо. Я использовал режим ECB для расшифровки зашифрованного текста с помощью ключа, а затем выполнил операцию xor'd с 16-байтовым массивом, дополненным 16 (заполнение PKCS7), чтобы получить IV.
 – 
klz
26 Мар 2011 в 21:03
Массив из 16 байтов был дополнен шестнадцатью 16 для представления пустой строки.
 – 
klz
26 Мар 2011 в 21:10