mcryptのを使用して暗号文を解読するために(3DES CBCモード)

StackOverflow https://stackoverflow.com/questions/1142477

  •  16-09-2019
  •  | 
  •  

質問

私は3DES CBCモードで暗号化された暗号文を、持っている、と私はいくつかの問題、それを復号化を抱えています。私は、以下の情報を持っている(実際のない値):

<?php
// Three 16 character long keys
$key1 = '1234567890123456';
$key2 = '6543210987654321';
$key3 = '6549873210456123';

// The initialisation vector
$ivec = '0102030405060708';

// A token which looks something like this
$token = '2ad82e09e3b4e7c491e4bb9fb7c606e1';
?>

私は<のhref =「http://www.t4vn.net/tutorials/showtutorials/An-Introduction-to-Mcrypt-and-PHP.html」のrelで発見されたPHPクラスのオフ私の復号化機能をベース= "nofollowをnoreferrer">このブログ記事で。それはこのようになります:

<?php
function decrypt($key,$iv,$token) {
    $td = mcrypt_module_open('tripledes', '', 'cbc', ''); 
    $iv = substr($iv, 0, mcrypt_enc_get_iv_size($td)); 
    $expected_key_size = mcrypt_enc_get_key_size($td); 

    $key = substr(md5($key), 0, $expected_key_size); 
    mcrypt_generic_init($td, $key, $iv);

    $decrypted_string = trim(mdecrypt_generic($td, base64_decode($token)));

    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    return $decrypted_string;
}
?>

しかし、私はアルゴリズムに3つのキーを供給するかどうかはわかりません。 。。私はそうのようにそれらを一緒にチェーン化しようとしている:。$のKEY3 $ KEY2 $キー1と、逆の順序ではなく、無駄に

任意の助けいただければ幸います。

役に立ちましたか?

解決

// 3つの16文字の長いキー
$ expected_key_size、24で3 * 8。キーは、16進形式の可能性が高いです。

function foo($hex) {
    $rv = '';
    foreach(str_split($hex, 2) as $b) {
        $rv .= chr(hexdec($b));
    }
    return $rv;
}

// Three 16 character long keys
$key1 = '1234567890123456';
$key2 = '6543210987654321';
$key3 = '6549873210456123';

$key = foo($key1.$key2.$key3);

他のヒント

私は最終的には機能に問題があることを発見しました。なお、復号鍵のMD5ハッシュを除去し、得られた平文のBase64でデコードを除去し、キー、IVEC変換の組み合わせであり、六角からトークン。

()プレーンテキストになったパディング文字が少し奇妙だったが、それはRTRIMを剥がします。また、暗号化が最初にいくつかの標準的なJavaライブラリを使用してJSPで行われたので、これは、Java暗号化→PHP復号行くから他の誰のために有用であるかもしれないことは注目に値するかもしれません。

あなたの助けのVolkerKのおかげで、ここで私は(私は以下追加していない、あなたの六角機能を含む)を使用して終わった機能があります:

$algorithm = 'tripledes';
$key   = 'F123ACA...'; // Some hex key
$ivec  = 'FE12FA1...'; // Some hex ivec
$token = 'F2ACE12...'; // Some hex token
$mode  = 'cbc';

$key    = foo($key);
$ivec   = foo($ivec);
$token  = foo($token);

function decrypt($key,$iv,$algorithm,$mode,$token) {
    $td = mcrypt_module_open($algorithm, '', $mode, '') ; 
    $iv = substr($iv, 0, mcrypt_enc_get_iv_size($td));

    $expected_key_size = mcrypt_enc_get_key_size($td); 
    $key = substr($key, 0, $expected_key_size); 

    mcrypt_generic_init($td, $key, $iv);

    $response = rtrim(mdecrypt_generic($td, $token), '');

    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    return $response;
}

$plaintext = decrypt($key,$ivec,$algorithm,$mode,$token);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top