私が自分の質問に答える前に、いくつかの感謝の気持ちを表す必要があります。Dave Boyer(Mister Dai)、Jason Dean、JasonDelmoreの協力に感謝します。
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に渡すキーの強度によって設定され、ブロックサイズを増やしても暗号化の強度は上がりません。