Jer*_*nch 7 php java encryption pkcs#5
我的任务是用运行PHP的东西替换遗留的java系统.
我在用PHP代码替换java加密时遇到了一点困难.
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"));
Run Code Online (Sandbox Code Playgroud)
似乎是Java的胆量
在PHP我正在做
$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>);
Run Code Online (Sandbox Code Playgroud)
pbkdf2来自这里.
所以<GUESS 1>是关键的大小和<GUESS 2>是IV.我玩这些无济于事.有没有人对这些价值观有所建议?据我所知,加密本身应该是可移植的,但我不确定某些Java方法发生了什么.
看起来java正在某处创建一个IV,但我不明白如何或在哪里.
有关
现有的两个答案都有帮助,但我将在这里发布完整的解决方案。
我没有在任何地方看到它的记录,但在查看了该加密方案的实现之后,我发现密钥是加密哈希的前 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);
}
Run Code Online (Sandbox Code Playgroud)
似乎可以解决问题。它取代了我的问题中的 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);
Run Code Online (Sandbox Code Playgroud)