Пару слов благодарности, прежде чем я отвечу на свой вопрос. Благодарю Дейва Бойера (Мистер Дай) , Джейсона Дина и Джейсона Делмора за помощь.
Как предположил Ли, мне пришлось использовать 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 внизу (особая благодарность Jason Delmore за этот слепок) гарантирует, что ColdFusion правильно создает байтовый массив для расшифровки. Некоторые другие способы создания байтовых массивов просто не работают или приводят к противоречивым результатам при дешифровании или повреждении буфера броска панели.
Вот и все. Это заняло слишком много усилий, когда стандартное шифрование AES использует 128-битные блоки и 128-битные ключи для классификации до SECRET, 192-разрядной или выше для TOP-SECRET. 256-битные блоки и 256-битные ключи - это просто немного. То, что ты можешь, не означает, что ты должен.
Пожалуйста, помните, что MCRYPT_RIJNDAEL_256 - это размер блока, а не уровень шифрования. Уровень шифрования определяется силой ключа, который вы передаете в mcrypt_encrypt, и увеличение размера блока не увеличивает надежность шифрования.