3

PHP (または Javascript) でいくつかのサービス呼び出しを解読する必要があります。これを達成するために一日中費やしましたが、適切に復号化できませんでした。

参考までに、サービス プロバイダーから次の Java の復号化サンプル コードが送られてきました。

DESKeySpec dks = new DESKeySpec("keyword".getBytes()); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
SecureRandom sr = new SecureRandom();  
cipher.init( Cipher.DECRYPT_MODE, key ,sr); 

byte b[] = response.toByteArray();      
byte decryptedData[] = cipher.doFinal( b );

私は次を使用して正しい道にいると思います:

$td = mcrypt_module_open(MCRYPT_DES, '', 'ecb', '');
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = substr($keyword, 0, mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$decrypted = mdecrypt_generic($td, $data);
$decrypted = pkcs5_unpad($decrypted);

しかし、率直に言って、私は $iv の作成と $keyword の設定 (または $data や $decrypted の型でしょうか?) ですべてを台無しにしていると確信しています。pkcs5_unpad 関数は次のとおりです。

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

私はphpだけでなく、暗号化技術にも精通しています...この問題を解決するのを手伝ってくれませんか?

4

1 に答える 1

0

キーが同じバイトで構成されていることを確認し (文字列は異なる方法でエンコードされている可能性があります)、ゼロで満たされた IV を入力してください。ECB モードは IV を使用しません (そして、PHP のマニュアルではそのように指定されています) が、1 つのデフォルトをすべてゼロにする場合、IV は最初のプレーン テキスト ブロックと XOR されるため、すべてゼロに設定します。その操作をキャンセルします。また、入力暗号データ​​が同じであることを確認してください。最初の例ではパディングを無視します。パディングを解除する前に、結果が正しいかどうかを確認できるはずです。

于 2012-04-18T00:17:38.147 に答える