Мне нужно расшифровать двоичный код в формате 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 .