PHP에서 Java로 암호화된 문자열을 해독하는 방법은 무엇입니까?
P粉083785014
2023-08-30 12:12:13
<p>다음 코드를 사용하여 JAVA에서 암호화된 문자열을 해독하려고 합니다. </p>
<pre class="lang-java Prettyprint-override"><code>SecretKey secretKey = new SecretKeySpec(build3DesKey(key), "DESede");
암호 cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] b = cipher.doFinal(str2ByteArray(dest));
문자열 디코더 = new String(b, "utf-8");
<pre class="lang-java Prettyprint-override"><code>private static byte[] build3DesKey(String keyStr)가 예외를 발생시킵니다. {
바이트[] 키 = 새 바이트[24];
byte[] temp = keyStr.getBytes("utf-8");
if (key.length > temp.length) {
System.arraycopy(temp, 0, key, 0, temp.length);
} 또 다른 {
System.arraycopy(임시, 0, 키, 0, 키.길이);
}
리턴 키;
}
<p>PHP 버전에서 동일한 결과를 얻으려면 어떻게 해야 합니까? PHP로 작성해 보았지만 출력이 잘못되었습니다. </p>
<pre class="brush:php;toolbar:false;">$data = '69C16E8142F2BDDE7569842BB0D68A3176624264E...';
$key = 'rpwdvbppnrvr56m123+#';
함수 해독($data, $secret)
{
//해시에서 키 생성
$key = md5(utf8_encode($secret), true);
//$key의 처음 8바이트를 $key 끝에 추가합니다.
$key .= substr($key, 0, 8);
$data = base64_decode($data);
$data = mcrypt_decrypt('tripledes', $key, $data, 'ecb');
$block = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = ord($data[$len-1]);
return substr($data, 0, strlen($data) - $pad);
}
var_dump(utf8_encode(Decrypt($data, $key)));</pre></p>
기능
으아악build3DesKey()
将一个太短的3DES密钥扩展到24个字节,通过在末尾填充0x00值,对于太长的密钥,末尾会被简单地截断。在PHP中,可以如下实现build3DesKey()
:기능이 부족함에도 불구하고
str2ByteArray()
,但其功能可以推断出来。由于在您的示例中,密文是十六进制编码的,所以这个函数似乎只是执行十六进制解码。在PHP中,与str2ByteArray()
相对应的是hex2bin()
.그래서 가능한 해독 구현은 다음과 같습니다(PHP/OpenSSL 사용):
으아악이러한 입력 데이터는 Java 코드에서 동일한 일반 텍스트를 반환합니다!
코드와의 차이점:
귀하의 코드는 더 이상 사용되지 않는
mcrypt
를 사용합니다. 보안상의 이유로 지금은 사용하면 안 됩니다. 더 나은 대안은 위 코드에 표시된 것처럼 PHP/OpenSSL입니다. 또한 구현된 키 파생이 잘못되었습니다. 예를 들어 Java 코드에서 전혀 사용되지 않는 MD5 다이제스트를 적용합니다.보안:
오래된 앱일 수 있지만 보안에 대한 몇 가지 참고 사항:
build3DesKey()
은 안전하지 않습니다. 키 자료가 문자열인 경우 일반적으로 키가 아니라 비밀번호입니다. 따라서 Argon2 또는 PBKDF2와 같은 신뢰할 수 있는 키 파생 함수를 사용해야 합니다.