2011-04-27 2 views
0

ColdFusion에서 이와 비슷한 기능을 수행하고자하는이 PHP가 있습니다.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에서 소금이 생성됩니다. ivSalt의 길이는 32 바이트 (256bits)이며, AES는 16 바이트 IV 소금을 기대하고 있기 때문에

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

불행하게도이 불면 :

이것은 내가 지금 가지고있는 암호화 호출입니다. here을 보면 AES 용 ColdFusion/Java의 최대 블록 크기는 16 바이트 (128 비트)입니다. 256 비트 블록 크기를 얻는 방법을 볼 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다. 이런 일을하는

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

내가 암호 저장 및 민감한 다른 위해 무엇을 보통 : 심지어이

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

나 :

+1

동일한 메시지를 사용하여 두 개를 실행하면 같은 결과가 나타 납니까? –

+0

Dave와 동의합니다. 하지만 나에게 뛰어 내리는 몇 가지 것들이 있습니다 : 1) 당신의 encrypt()'key'가 없거나/공백이 있습니다. 2) 당신이'iv'를 통과하지 못하고 3) 암호화 모드가 php에 의해 사용 된 것과 일치해야합니다. – Leigh

+0

Ah ... 나는 방금 PHP에 관해 뭔가를 기억했다. this-> 키는 ColdFusion에서 this.key와 같습니다. 그래서 저는 PHP 파일의 나머지 부분에서 열쇠와 IV 소금을 파헤쳐야합니다. 이것이 제가 좀 더 이해할 수 있도록 도와 줄 것입니다. –

답변

3

난 내 자신의 질문에 대답하기 전에 감사의 몇 외출해야한다. 도움을 주신 Dave Boyer (Mister Dai) 덕분에 Jason DeanJason Delmore입니다.

리 내가 탄력 성, 경량의 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는 블록 크기가 기본적으로 256 비트이더라도 암호가 암호화 또는 암호 해독에 사용되는지 여부와 블록 크기를 나타내는 부울을 ivSalt 키로 사용합니다. 이 함수는 상당히 잘 설명되어 있으므로 이해가되어야합니다.

맨 아래에있는 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

당신은 간단하게 뭔가를 할 수 데이터.

링크 및/또는 예 도움이되기를 희망 Brds

+0

Brds에 감사드립니다. 해시가 문자열을 암호화하는 동안 의심 스럽지만 결과를 해독 할 수 있어야합니다. 또한, 내가 틀리지 않는 한, hash()는 AES를 지원하지 않습니다 (RIJNDAEL은 AES가 맞습니까?) –

+0

오른쪽. 해시()는 역전/해독 될 수 없으며 AES/Rijndael은 지원되는 * 해시 * 알고리즘이 아니며 단지 encrypt()입니다. http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7c52.html – Leigh

관련 문제