0

PHPで3des文字列をデコードする必要がありますが、これまで解読した経験がありません...

最初のステップは、デコードするキーと文字列のセットを取得することです - 私はすでにそれを持っています。

アルゴリズムに関する次の情報があります。

タイプ: CBC、パディング - PKCS5、初期化ベクトル (iv?) - 8 つのゼロの配列

私はこの方法を試します:

// very simple ASCII key and IV
$key = "passwordDR0wSS@P6660juht";
$iv = "password";
//$iv = array('0','0','0','0','0','0','0','0');
//$iv = "00000000";

$cipher = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');

//$iv = mcrypt_enc_get_iv_size($cipher);


// DECRYPTING
echo "<b>String to decrypt:</b><br />51196a80db5c51b8523220383de600fd116a947e00500d6b9101ed820d29f198c705000791c07ecc1e090213c688a4c7a421eae9c534b5eff91794ee079b15ecb862a22581c246e15333179302a7664d4be2e2384dc49dace30eba36546793be<br /><br />";

echo "<b>Decrypted 3des string:</b><br /> ".SimpleTripleDesDecrypt('51196a80db5c51b8523220383de600fd116a947e00500d6b9101ed820d29f198c705000791c07ecc1e090213c688a4c7a421eae9c534b5eff91794ee079b15ecb862a22581c246e15333179302a7664d4be2e2384dc49dace30eba36546793be')."<br />";

function SimpleTripleDesDecrypt($buffer) {
  global $key, $iv, $cipher;

  mcrypt_generic_init($cipher, $key, $iv);
  $result = rtrim(mdecrypt_generic($cipher, hex2bin($buffer)), "\0");
  mcrypt_generic_deinit($cipher);
  return $result;
}

function hex2bin($data)
{
  $len = strlen($data);
  return pack("H" . $len, $data);
} 

最初にサンプル データが表示され、このデータ コードでは正常に動作します。SOAP Web サービスによってデータベースから取得した独自のデータを使用しようとすると、問題が発生します。次のエラーが表示されます。

警告: pack() [function.pack]: タイプ H: 不正な 16 進数が....

ここに画像の説明を入力

スクリプトでさまざまな種類のコーディングを試みたにもかかわらず、これを取得しました。スクリプト ファイル自体は ANCI にあります。

また、コメントでわかるように、私もIVでいくつかの実験を行いましたが、最初の問題に対処しないと意味がありません。

もう1つはパディング== PKCS5です。それを使用する必要がありますか?私の場合はどのようにすればよいですか?

これについて助けていただければ幸いです。

4

1 に答える 1

0

OK、私は主にこの投稿に基づいた解決策を見つけました: PHP Equivalent for Java Triple DES 暗号化/復号化- ありがとう、+1。

$iv = array('0','0','0','0','0','0','0','0');
echo @decryptText($temp->patient->firstName, $deszyfrator->return->rawDESKey, $iv);
echo @decryptText($temp->patient->surname, $deszyfrator->return->rawDESKey, $iv);

function decryptText($encryptText, $key, $iv) {

    $cipherText = base64_decode($encryptText);
    $res = mcrypt_decrypt("tripledes", $key, $cipherText, "cbc", $iv);

    $resUnpadded = pkcs5_unpad($res);    
    return $resUnpadded;
}

function pkcs5_unpad($text)
{
    $pad = ord($text{strlen($text)-1});
    if ($pad > strlen($text)) return false;
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
    return substr($text, 0, -1 * $pad);
}

ただし、警告が表示されます(@で非表示になりました)。「Ivはブロックサイズと同じ長さでなければなりません」-私が理解できるすべての組み合わせを試しましたが、それを取り除くことはできません。アイデアはありますか?

編集:二次的な問題が修正されました。このコードはivを修正します:

$iv_size=mcrypt_get_iv_size("tripledes","cbc");
$iv = str_repeat("\0", $iv_size);   //iv size for 3des is 8
于 2012-12-29T21:46:14.077 に答える