Прежде чем я отвечу на свой вопрос, следует поблагодарить пару благодарностей. Спасибо Дэйву Бойеру (мистер Дай), Джейсона Дина и Джейсона Делмора за помощь.
Как предложил Ли, мне пришлось использовать Bouncy Castle, облегченный API и шифровальный движок Rijndael.
В итоге я получил функцию для создания шифра rijndael и функции для шифрования и дешифрования строки с помощью ключа и ivsalt.
<cfcomponent displayname="Bounce Castle Encryption Component" hint="This provides bouncy castle encryption services" output="false">
<cffunction name="createRijndaelBlockCipher" access="private">
<cfargument name="key" type="string" required="true" >
<cfargument name="ivSalt" type="string" required="true" >
<cfargument name="bEncrypt" type="boolean" required="false" default="1">
<cfargument name="blocksize" type="numeric" required="false" default=256>
<cfscript>
// Create a block cipher for Rijndael
var cryptEngine = createObject("java", "org.bouncycastle.crypto.engines.RijndaelEngine").init(arguments.blocksize);
// Create a Block Cipher in CBC mode
var blockCipher = createObject("java", "org.bouncycastle.crypto.modes.CBCBlockCipher").init(cryptEngine);
// Create Padding - Zero Byte Padding is apparently PHP compatible.
var zbPadding = CreateObject('java', 'org.bouncycastle.crypto.paddings.ZeroBytePadding').init();
// Create a JCE Cipher from the Block Cipher
var cipher = createObject("java", "org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher").init(blockCipher,zbPadding);
// Create the key params for the cipher
var binkey = binarydecode(arguments.key,"hex");
var keyParams = createObject("java", "org.bouncycastle.crypto.params.KeyParameter").init(BinKey);
var binIVSalt = Binarydecode(ivSalt,"hex");
var ivParams = createObject("java", "org.bouncycastle.crypto.params.ParametersWithIV").init(keyParams, binIVSalt);
cipher.init(javaCast("boolean",arguments.bEncrypt),ivParams);
return cipher;
</cfscript>
</cffunction>
<cffunction name="doEncrypt" access="public" returntype="string">
<cfargument name="message" type="string" required="true">
<cfargument name="key" type="string" required="true">
<cfargument name="ivSalt" type="string" required="true">
<cfscript>
var cipher = createRijndaelBlockCipher(key=arguments.key,ivSalt=arguments.ivSalt);
var byteMessage = arguments.message.getBytes();
var outArray = getByteArray(cipher.getOutputSize(arrayLen(byteMessage)));
var bufferLength = cipher.processBytes(byteMessage, 0, arrayLen(byteMessage), outArray, 0);
var cipherText = cipher.doFinal(outArray,bufferLength);
return toBase64(outArray);
</cfscript>
</cffunction>
<cffunction name="doDecrypt" access="public" returntype="string">
<cfargument name="message" type="string" required="true">
<cfargument name="key" type="string" required="true">
<cfargument name="ivSalt" type="string" required="true">
<cfscript>
var cipher = createRijndaelBlockCipher(key=arguments.key,ivSalt=arguments.ivSalt,bEncrypt=false);
var byteMessage = toBinary(arguments.message);
var outArray = getByteArray(cipher.getOutputSize(arrayLen(byteMessage)));
var bufferLength = cipher.processBytes(byteMessage, 0, arrayLen(byteMessage), outArray, 0);
var originalText = cipher.doFinal(outArray,bufferLength);
return createObject("java", "java.lang.String").init(outArray);
</cfscript>
</cffunction>
<cfscript>
function getByteArray(someLength)
{
byteClass = createObject("java", "java.lang.Byte").TYPE;
return createObject("java","java.lang.reflect.Array").newInstance(byteClass, someLength);
}
</cfscript>
</cfcomponent>
Функции doEncrypt и doDecrypt общедоступны, но не функция, создающая шифр rijndael. Функции шифрования и дешифрования принимают строку, ключ и ivSalt, возвращая соответственно зашифрованную или расшифрованную строку.
createRijndaelBlockCipher принимает ключ ivSalt, логическое значение, указывающее, будет ли шифр использоваться для шифрования или дешифрования, и размер блока, хотя размер блока по умолчанию равен 256 битам. Функция довольно хорошо прокомментирована, поэтому она должна иметь смысл.
UDF внизу (особая благодарность Джейсону Делмору за этот самородок) гарантирует, что ColdFusion правильно создаст массив байтов для расшифровки. Некоторые другие способы создания массивов байтов просто не работают или приводят к несогласованным результатам в ошибках расшифровки или повреждения буфера буфера.
Вот об этом на самом деле. Потребовалось слишком много усилий, когда стандартное шифрование AES использует 128-битные блоки, а 128-битные ключи предназначены для классификации до СЕКРЕТНО, 192-битные или выше для СОВЕРШЕННО СЕКРЕТНО. 256-битные блоки и 256-битные ключи — это немного больше. То, что вы можете, не означает, что вы должны.
Помните, что MCRYPT_RIJNDAEL_256 — это размер блока, а не уровень шифрования. Уровень шифрования задается силой ключа, который вы передаете в mcrypt_encrypt, и увеличение размера блока не увеличивает силу шифрования.
person
Stephen Moretti
schedule
03.05.2011
key
отсутствует/пусто 2) вы не передаетеiv
и 3) шифрованиеmode
должно совпадать с используемым php - person Leigh   schedule 27.04.2011mode
. IIRC CF по умолчанию имеет значениеECB
, а пример php, похоже, используетCBC
- person Leigh   schedule 28.04.2011