一對夫婦感謝的應該走出去之前,我回答我的問題。感謝Dave Boyer (Mister Dai),Jason Dean和Jason 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的密鑰強度設置,增加塊大小不會增加加密強度。
當你使用相同的消息運行這兩個你會得到相同的結果? – 2011-04-27 17:46:42
我同意戴夫。但是有一些事情在我身上跳出來:1)您的encrypt()'key'丟失/空白2)您沒有通過'iv'和3)加密'mode'需要匹配php使用的 – Leigh 2011-04-27 19:03:00
啊...我只記得一些關於PHP的東西。這個鍵在ColdFusion中就像this.key。所以我需要在PHP文件的其餘部分挖掘密鑰和IV鹽,這應該有助於我更好地理解這一點。 – 2011-04-27 20:22:47