ColdFusion расшифровывает AES128 PKCS7Padding CBC - PullRequest
3 голосов
/ 19 октября 2011

Мне нужно расшифровать двоичный код в формате base64 в строковом формате [0-9a-zA-Z + /].Часть этой строки состоит из ivSalt, который является первыми 16 байтами или 128 битами.Остальные данные;все было зашифровано с использованием AES с ключом 128 и 128 блоками CBC и PKCS7Padding.

Сначала необходимо преобразовать строку в двоичный файл:

<cfset b64 = ToBinary(enc)/>

Затем мы создаем буфер байтов Java:

<cfset objByteBuffer = CreateObject(
  "java",
  "java.nio.ByteBuffer") />

Затем мы инициализируем буфер для соли и буфер для данных, которые необходимо расшифровать.

<cfset objBufferA = objByteBuffer.Allocate(
  JavaCast( "int", 16 )) />

<cfset objBufferB = objByteBuffer.Allocate(  
  JavaCast( "int", (Len(b64)-16) )) />

Затем мы заполняем буферы нашими байтами.

<cfset objBufferA.Put(
  b64,
  JavaCast( "int", 0 ),
  JavaCast( "int", 16 )) />

<cfset objBufferB.Put(
  b64,
  JavaCast( "int", 16 ),
  JavaCast( "int", (Len(b64)-16) )) />

<cfset ivStringBin = objBufferA.Array()/>
<cfset dataStringBin = objBufferB.Array()/>

Поскольку функция расшифровки принимает шестнадцатеричную строку, мы должны закодировать ее в шестнадцатеричное.

<!--- create byteArray output stream --->
<cfset baos = createObject("java", "java.io.ByteArrayOutputStream")>
<!--- write the byteArray stored in the DB to the output stream --->
<cfset baos.write(ivStringBin)>
<!--- convert binary content to text string --->
<cfset ivString=BinaryEncode(baos.toByteArray(),"hex")/>

<!--- create byteArray output stream --->
<cfset baos2 = createObject("java", "java.io.ByteArrayOutputStream")>
<!--- write the byteArray stored in the DB to the output stream --->
<cfset baos2.write(dataStringBin)>
<!--- convert binary content to text string --->  

<cfset dataString=BinaryEncode(baos2.toByteArray(),"hex")/>

Должно быть:

<cfset dataString=BinaryEncode(baos2.toByteArray(),"base64")/>

Теперь яЯ не уверен, что делать с ключом, но он должен быть в шестнадцатеричном формате.

<cfset key = BinaryEncode(ToBinary("{16 chars, [0-9a-zA-Z+/]}")/>

Должно быть:

<cfset key = "{32 chars, [0-9A-Z]}"/>

ColdFusion сам не поддерживает PKCS7Padding с CBC, я получаю ошибку неподдерживаемого провайдера.Итак, я иду и устанавливаю BouncyCastle, и я нашел замечательный пример ColdFusion того, как расшифровать с помощью PKCS5Padding. Дешифрование / повторное шифрование зашифрованной строки ColdFusion в PHP "> здесь. Я добавил его в свой код, но мне нужен PKCS7Padding, поэтому я изменил

var zbPadding = CreateObject('java', 'org.bouncycastle.crypto.paddings.ZeroBytePadding').init();

до

var zbPadding = CreateObject('java', 'org.bouncycastle.crypto.paddings.PKCS7Padding').init();

в соответствии с документами Bouncy Castle .

При всем этом я получаю ошибку:

"Key length not 128/160/192/224/256 bits."

Я буду пробовать и продолжать, но я полностью застрял, я не могу понять, что я делаю неправильно.

Редактировать 1:

Я получил это работает!

  • Строка dataString должна быть в base64 вместо шестнадцатеричного.
  • Ключ при преобразовании в шестнадцатеричный с использованием coldFusion равен 24 [0-9A-F] символампредставляющий 24x4 = 96 битов, что составляет 12 байт. Это должно быть 16 байт, так что почему-то функция BinaryEncode (ToBinary ()) не выполняет свою работу. Поэтому я использовал инструмент преобразования строки в шестнадцатеричный форматзатем он получил 32 символа.

Редактировать 2: Кроме того, чтобы установить Bouncy CasЯ следовал инструкциям по установке оживленного замка и загрузил jce из нижней части страницы java .

1 Ответ

1 голос
/ 20 октября 2011

У меня все заработало!

  • Строка data должна быть в base64 вместо шестнадцатеричного.

  • ключ, при преобразовании в шестнадцатеричный код с использованием coldFusion 24 символа [0-9A-F], представляющих 24x4 = 96 бит, что составляет 12 байтов.Оно должно быть 16 байтов, поэтому функция BinaryEncode (ToBinary ()) почему-то не выполняет свою работу.Поэтому я использовал инструмент преобразования строки в шестнадцатеричный формат, а затем получил 32 символа.Редактировать 2: Кроме того, чтобы установить Bouncy Castle, я следовал инструкциям по установке Bouncy Castle и загрузил jce из нижней части страницы загрузок Java.

...