7

PHP と Coldfusion で生成された同じ結果を再現するのに問題があります。

この方法で PHP を暗号化する場合:

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

    $base = chop(base64_encode(mcrypt_encrypt(MCRYPT_DES, $key, $Valor, MCRYPT_MODE_ECB)));     
?>

私は結果を持っています:

TzwRx5Bxoa0=

Coldfusion では、次のようにしました。

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

結果:

qOQnhdxiIKs=

ColdFusion が PHP と同じ価値をもたらさないものは何ですか?

どうもありがとうございました

4

2 に答える 2

5

(コメントが長すぎる)

Artjom B. はすでに上記の回答を提供していますArtjo B. が書いた

問題はパディングです。PHP の mcrypt 拡張機能は ZeroPadding のみを使用します [...] PHP で平文をパディングする必要があります [...] または、「DES/ECB/NoPadding」などの ColdFusion で別の暗号を使用します。前者をお勧めします。NoPadding を使用する場合、平文は既にブロック サイズの倍数である必要があります。

残念ながら、 CFでヌル文字を生成することは困難です。私の知る限り、機能する唯一のテクニックは使用することURLDecode("%00")です。@Artjom B. が提案したように PHP コードを変更できない場合は、以下の関数を使用して CF にテキストを埋め込むことができます。免責事項: 軽くテストしただけですが (CF10)、上記と同じ結果が得られたようです。

更新: CF encrypt() 関数は常にプレーン テキスト入力を UTF-8 文字列として解釈するため、charsetEncode(bytes, "utf-8")を使用して単一要素のバイト配列から null 文字を作成することもできます。 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 ); 

関数:

/*
   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;
}
于 2015-03-08T04:39:31.353 に答える