2011-04-27 78 views
0

我有這樣的PHP,我希望在ColdFusion中做相同的處理。將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") 

但我肯定知道的沒有真正的方法,它不手感相當不錯,所以我不知道是否有人在那裏就足夠好指向正確的方向。

更新: 對於信息this answerMister Dai,是特別有幫助。

所以MCRYPT_RIJNDAEL_256實際上是指block size not the encryption strength。加密強度仍然是256,因爲使用在sha-256處散列的值在PHP中生成密鑰和salt。

這是加密呼叫我現在有:

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

不幸的是這炸燬因爲ivSalt長度爲32個字節(256位)和AES僅期待一個16個字節IV的鹽。查看here似乎ColdFusion/Java for AES中的最大塊大小是16字節(128位)。我似乎無法瞭解如何獲得256位塊大小。任何幫助將不勝感激。

+1

當你使用相同的消息運行這兩個你會得到相同的結果? – 2011-04-27 17:46:42

+0

我同意戴夫。但是有一些事情在我身上跳出來:1)您的encrypt()'key'丟失/空白2)您沒有通過'iv'和3)加密'mode'需要匹配php使用的 – Leigh 2011-04-27 19:03:00

+0

啊...我只記得一些關於PHP的東西。這個鍵在ColdFusion中就像this.key。所以我需要在PHP文件的其餘部分挖掘密鑰和IV鹽,這應該有助於我更好地理解這一點。 – 2011-04-27 20:22:47

回答

3

一對夫婦感謝的應該走出去之前,我回答我的問題。感謝Dave Boyer (Mister Dai),Jason DeanJason Delmore的幫助。

由於利曾建議我不得不利用充氣城堡,重量輕的API,並在Rijndael算法加密引擎存在的。

我結束了一個函數來創建一個Rijndael算法的密碼和功能進行加密和解密帶有鑰匙和iv鹽的字符串。

<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的密鑰強度設置,增加塊大小不會增加加密強度。

-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") /> 

做這樣的事情通常是我說的密碼存儲和其他敏感辦數據。

希望鏈路和/或示例幫助, 惟妙惟肖

+0

感謝那些Brds。我懷疑哈希會加密字符串,但我需要能夠解密結果。另外,除非我誤解了,hash()不支持AES(RIJNDAEL是AES對不對?) – 2011-04-27 20:28:31

+0

對。哈希()不能被反轉/解密,並且AES/Rijndael不是支持的*哈希*算法,只有encrypt()。 http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7c52.html – Leigh 2011-04-27 23:27:06