2013-12-17 21 views
7

私はレガシーJavaシステムをPHPを実行するものに置き換えることを任されています。PKCS5暗号化のためにJAVAをPHPに置き換える

私は、Java暗号をPHPコードに置き換えるのにちょっとした努力をしています。

cipherAlgorythm = "PBEWithMD5AndDES";       
cipherTransformation = "PBEWithMD5AndDES/CBC/PKCS5Padding";  
PBEParameterSpec ps = new javax.crypto.spec.PBEParameterSpec(salt, iterations); 
SecretKeyFactory kf = SecretKeyFactory.getInstance(cipherAlgorythm); 
SecretKey key = kf.generateSecret(new javax.crypto.spec.PBEKeySpec(password.toCharArray())); 
Cipher encryptCipher = Cipher.getInstance(cipherTransformation); 
encryptCipher.init(Cipher.ENCRYPT_MODE, key, ps); 
byte[] output = encryptCipher.doFinal("This is a test string".getBytes("UTF-8")); 

は、キーのサイズがある

$hashed_key = pbkdf2('md5', $this->key, $this->salt, $this->reps , <GUESS 1>, TRUE); 
$output = mcrypt_encrypt(MCRYPT_DES, $hashed_key, "This is a test string", MCRYPT_MODE_CBC, <GUESS 2>); 

PBKDF2だからhere.

<GUESS 1>からである私がやっているPHPでのJava

の根性ているように見えると<GUESS 2>はIVであります。私はこれらを使って無駄に遊んだ。誰もそのような値の提案をしていますか?私が見る限り、暗号化自体は移植可能でなければなりませんが、Javaメソッドの中で何が起こっているのかは分かりません。

JavaがどこかでIVを作成しているように見えますが、どうやってどこか分かりません。

RELATED

Decrypt (with PHP) a Java encryption (PBEWithMD5AndDES)

答えて

1

で完全なサンプルを見てみましょどちら既存の答えが助けたが、私はここに完全なソリューションを投稿します。

私はそれがどこかに文書見られますが、私は、キーは暗号化されたハッシュの最初の8バイトで、IVは、最後の8

public function get_key_and_iv($key, $salt, $reps) { 
    $hash = $key . $salt; 
    for ($i = 0; $i< $reps; $i++) { 
     $hash = md5($hash, TRUE); 
    } 
    return str_split($hash,8); 
    } 

であるように思わ見つけ、この暗号化方式の実装を見た後にしていませんトリックを行う。これは私の質問でpbkdf2を置き換え、<GUESS 1>の必要性を否定し、<GUESS 2>の値を与える

その後、私はジェームズブラックが言及し修正することができたパディングの問題に巻き込まれた。最終的なコードは

list($hashed_key, $iv) = get_key_and_iv($key, $salt, $reps); 
// 8 is DES block size. 
$pad = 8 - (strlen($plaintext) % 8); 
$padded_string = $plaintext . str_repeat(chr($pad), $pad); 
return mcrypt_encrypt(MCRYPT_DES, $hashed_key, $padded_string, MCRYPT_MODE_CBC, $iv); 
です
1

あなたはhttp://us3.php.net/manual/en/ref.mcrypt.php#69782を見てみたいことがありますが、基本的に彼はDIYパディングソリューション実装:

function pkcs5_pad ($text, $blocksize) 
{ 
    $pad = $blocksize - (strlen($text) % $blocksize); 
    return $text . str_repeat(chr($pad), $pad); 
} 

あなたの最善の策かもしれないが、あなたの場合このコメントを見て、各ステップが正しいことを確認する方法に関する彼の提案は、あなたにとって有用かもしれません。理想的には

https://stackoverflow.com/a/10201034/67566

あなたはDESから離れると、このパディングはPHPで問題になるだろうので、あなたはあまり面倒な、より安全なものに暗号化アルゴリズムを変更することができれば、なぜ見るべきではないのですか?

このページを表示するには、http://www.ietf.org/rfc/rfc4772.txtを参照してください。ここでは、DESはブルートフォース攻撃の影響を受けやすいと簡潔に表現されているため、非難され、AESに置き換えられました。

1

PBKDF2 PHPライブラリを使用する代わりにhash_pbkdf2 PHP (5.5) functionを使用することもできます。

PHPのドキュメントによれば、GUESS 1は、作成した派生鍵

出力文字列の長さの長さです。 raw_outputがTRUEの場合、これは派生キーのバイト長の に対応します。raw_outputが の場合、これは派生キーのバイト長の2倍に相当します( は2バイトの16進数として返されます)。

0を渡すと、指定されたアルゴリズムの出力全体が使用されます。

多分、このpost (what is an optimal Hash size in bytes?)はおもしろい結果です。

GUESS 2またはIVは、ハッシュを生成するために固有の塩を作成するために使用されるランダム初期化ベクトルです。

mycript_create_iv functionでIVを作成できます。

はPHP.net

<?php 
$password = "password"; 
$iterations = 1000; 

// Generate a random IV using mcrypt_create_iv(), 
// openssl_random_pseudo_bytes() or another suitable source of randomness 
$salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); 

$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20); 
echo $hash; 
?>