Код шифрования PHP, преобразованный в ColdFusion - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть немного PHP, который я бы хотел сделать эквивалентным в ColdFusion.

function & _encryptMessage( $message ) {

   $td = mcrypt_module_open( MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
   mcrypt_generic_init( $td, $this->key, $this->iv );
   $encrypted_data = mcrypt_generic( $td, $message );
 mcrypt_generic_deinit($td);
 mcrypt_module_close($td);

   return base64_encode( $encrypted_data );
}

Я думаю, что это просто

encrypt(message,"","AES","Base64")

Но у меня нет реального способа узнать наверняка, и это не совсем правильно, поэтому я подумал, будет ли кто-то там достаточно хорошим, чтобы указать мне правильное направление.

ОБНОВЛЕНИЕ: Для информации этот ответ Мистер Дай был особенно полезен.

Таким образом, MCRYPT_RIJNDAEL_256 фактически означает размер блока, а не степень шифрования . Уровень шифрования по-прежнему равен 256, поскольку ключ и соль генерируются в PHP с использованием значения, хэшированного в sha-256.

Это зашифрованный звонок, который у меня сейчас есть:

encrypt(arguments.messageXML,instance.key,"AES/CBC/PKCS5Padding","Base64",ivSalt)

К сожалению, это взрывается, потому что ivSalt имеет длину 32 байта (256 бит), а AES ожидает только 16 байтов соли iv. Если посмотреть здесь , то может показаться, что максимальный размер блока в ColdFusion / Java для AES составляет 16 байт (128 бит). Кажется, я не вижу, как получить 256-битный размер блока. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 04 мая 2011

Пару слов благодарности, прежде чем я отвечу на свой вопрос. Благодарю Дейва Бойера (Мистер Дай) , Джейсона Дина и Джейсона Делмора за помощь.

Как предположил Ли, мне пришлось использовать 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, и увеличение размера блока не увеличивает надежность шифрования.

0 голосов
/ 28 апреля 2011

http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7c52.html

Вы можете сделать что-то простое, как:

<cfset stringName = "variable 1: " & variable1 & " some more text" />
<cfset varName = HASH(stringName, "SHA") />

или даже это:

<cfset varName = HASH("i want this string to be encrypted", "SHA") />

Обычно я делаю что-то подобное для хранения паролей и других конфиденциальных данных.

Надеюсь, что ссылка и / или примеры помогут, Brds

...