찾다

 >  Q&A  >  본문

PHP에서 Java로 암호화된 문자열을 해독하는 방법은 무엇입니까?

<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>
P粉083785014P粉083785014453일 전561

모든 응답(1)나는 대답할 것이다

  • P粉014218124

    P粉0142181242023-08-31 10:27:11

    기능 build3DesKey() 将一个太短的3DES密钥扩展到24个字节,通过在末尾填充0x00值,对于太长的密钥,末尾会被简单地截断。在PHP中,可以如下实现 build3DesKey():

    으아악

    기능이 부족함에도 불구하고 str2ByteArray(),但其功能可以推断出来。由于在您的示例中,密文是十六进制编码的,所以这个函数似乎只是执行十六进制解码。在PHP中,与 str2ByteArray() 相对应的是 hex2bin().

    그래서 가능한 해독 구현은 다음과 같습니다(PHP/OpenSSL 사용):

    으아악

    이러한 입력 데이터는 Java 코드에서 동일한 일반 텍스트를 반환합니다!


    코드와의 차이점:
    귀하의 코드는 더 이상 사용되지 않는 mcrypt를 사용합니다. 보안상의 이유로 지금은 사용하면 안 됩니다. 더 나은 대안은 위 코드에 표시된 것처럼 PHP/OpenSSL입니다. 또한 구현된 키 파생이 잘못되었습니다. 예를 들어 Java 코드에서 전혀 사용되지 않는 MD5 다이제스트를 적용합니다.


    보안:
    오래된 앱일 수 있지만 보안에 대한 몇 가지 참고 사항:

    • 키 파생 build3DesKey()은 안전하지 않습니다. 키 자료가 문자열인 경우 일반적으로 키가 아니라 비밀번호입니다. 따라서 Argon2 또는 PBKDF2와 같은 신뢰할 수 있는 키 파생 함수를 사용해야 합니다.
    • des-ede3은 안전하지 않은 ECB 모드를 적용합니다. 이제 AES-GCM과 같은 인증된 암호화를 사용해야 합니다.
    • 3DES/TripleDES는 더 이상 사용되지 않으며 아직 더 이상 사용되지 않은 유일한 변형인 Triple Length Key 또는 3TDEA도 곧 더 이상 사용되지 않으며 상대적으로 느립니다. 오늘의 기준은 AES를 적용하는 것입니다.

    회신하다
    0
  • 취소회신하다