0

私はColdFusionで同等のことをしたいPHPのこのビットを持っています。

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は、実際には暗号化強度ではなくブロックサイズを意味します。キーとソルトはsha-256でハッシュされた値を使用してPHPで生成されるため、暗号化強度は256のままです。

これは私が今持っている暗号化呼び出しです:

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

残念ながら、ivSaltの長さは32バイト(256ビット)であり、AESは16バイトのivソルトのみを想定しているため、これは爆発的に増加します。ここを見ると、ColdFusion / Java for AESの最大ブロックサイズは16バイト(128ビット)のようです。256ビットのブロックサイズを取得する方法がわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

3

私が自分の質問に答える前に、いくつかの感謝の気持ちを表す必要があります。Dave Boyer(Mister Dai)Jason DeanJasonDelmoreの協力に感謝します。

Leighが提案したように、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に渡すキーの強度によって設定され、ブロックサイズを増やしても暗号化の強度は上がりません。

于 2011-05-03T22:46:44.987 に答える
-2

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

于 2011-04-27T20:09:34.223 に答える