在Coldfusion中加密,然后在PHP中解密

Hil*_*ior 7 php encryption coldfusion coldfusion-11

我有一个问题,复制PHP和Coldfusion生成的相同结果.

在PHP加密这种方式:

<?php
    $key = "$224455@";
    $Valor = "TESTE";

    $base = chop(base64_encode(mcrypt_encrypt(MCRYPT_DES, $key, $Valor, MCRYPT_MODE_ECB)));     
?>
Run Code Online (Sandbox Code Playgroud)

我有结果:

TzwRx5Bxoa0 =

在Coldfusion这样做:

<cfset Valor = "TESTE">
<cfset Key = "$224455@">
<cfset base = Encrypt(Valor,ToBase64(Key),"DES/ECB/PKCS5Padding","BASE64")>
Run Code Online (Sandbox Code Playgroud)

结果:

qOQnhdxiIKs =

什么不是ColdFusion产生与PHP相同的价值?

非常感谢你

Art*_* B. 5

问题是填充.PHP的mcrypt扩展仅使用ZeroPadding.这意味着明文填充0x00字节,直到达到块大小的倍数.

另一方面,PKCS#5/PKCS#7填充用字节填充它,表示在块大小的下一个倍数之前丢失的字节数.DES的块大小为8个字节.

因此,您需要在php中填充明文(请参阅此插入代码:A:如何从AES加密字符串添加/删除PKCS7填充?)或在ColdFusion中使用其他密码,例如"DES/ECB/NoPadding".我推荐前者,因为如果使用NoPadding,明文必须已经是块大小的倍数.

$key = "$224455@";
$Valor = "TESTE";
function pkcs7pad($plaintext, $blocksize)
{
    $padsize = $blocksize - (strlen($plaintext) % $blocksize);
    return $plaintext . str_repeat(chr($padsize), $padsize);
}

$base = chop(base64_encode(mcrypt_encrypt(MCRYPT_DES, $key, pkcs7pad($Valor, 8), MCRYPT_MODE_ECB)));
Run Code Online (Sandbox Code Playgroud)

结果:

qOQnhdxiIKs =

如果您在PHP中解密,请不要忘记取消恢复的纯文本.


Lei*_*igh 5

(评论太长)

Artjom B.已经提供了上面的答案.Artjom B.写道

问题是填充.PHP的mcrypt扩展只使用ZeroPadding [...]你要么在php [...]中填充明文,要么在ColdFusion中使用不同的密码,如"DES/ECB/NoPadding".我推荐前者,因为如果使用NoPadding,明文必须已经是块大小的倍数.

不幸的是,很难在CF中产生空字符.AFAIK,唯一有效的技术是使用URLDecode("%00").如果您无法修改PHP代码为@Artjom B.建议,您可以尝试使用下面的函数填充CF中的文本.免责声明:它只是经过轻微测试(CF10),但似乎产生与上述相同的结果.

更新:由于CF encrypt()函数始终将纯文本输入解释为UTF-8字符串,因此您还可以使用charsetEncode(bytes,"utf-8")从单个元素字节数组创建空字符,即 charsetEncode( javacast("byte[]", [0] ), "utf-8")


例:

Valor = nullPad("TESTE", 8);
Key = "$224455@";
result = Encrypt(Valor, ToBase64(Key), "DES/ECB/NoPadding", "BASE64");
// Result: TzwRx5Bxoa0=
WriteDump( "Encrypted Text = "& Result ); 
Run Code Online (Sandbox Code Playgroud)

功能:

/*
   Pads a string, with null bytes, to a multiple of the given block size

   @param plainText - string to pad
   @param blockSize - pad string so it is a multiple of this size
   @param encoding - charset encoding of text
*/
string function nullPad( string plainText, numeric blockSize, string encoding="UTF-8")
{
    local.newText = arguments.plainText;
    local.bytes = charsetDecode(arguments.plainText, arguments.encoding);
    local.remain = arrayLen( local.bytes ) % arguments.blockSize;

    if (local.remain neq 0) 
    {
        local.padSize = arguments.blockSize - local.remain;
        local.newText &= repeatString( urlDecode("%00"), local.padSize );
    }

    return local.newText;
}
Run Code Online (Sandbox Code Playgroud)