2014-11-09 1 views
-3

누구든지 PHP 코드를 설명하고 Java에서 코드를 이식하는 방법에 대한 힌트를 줄 수 있습니까? 여기 암호화/해독 - PHP Equvilent를 JAVA로 인 코드/디코드

는 PHP 코드 :

function decode_string($encoded_string, $key) { 
    $decoded = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encoded_string), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); 

    return $decoded; 
} 
+2

하나의 프로그래밍 언어가 훌륭하다고 가정하면이 코드가 무엇을하는지 분명히 알 수 있습니다. 확실하지 않은 함수 호출 [고글 수 있음] (http://php.net/manual/en/function.mcrypt-decrypt.php). 이 코드를 작성한 사람은 암호화에 대한 지식이 없으며 여러 항목을 암호화하는 데 동일한 IV를 사용하고 있으므로 암호화가 다소 쓸모 없게됩니다. –

답변

2

OK, 나는 물린 것입니다,하지만 난 당신이 코딩 할 드리겠습니다 :

  • rtrim(x, "\0")을 다음 뇌사 제로 패딩 (0을 제거합니다. PHP는 15 바이트의 0을 사용합니다. 이것은 CBC에 필요한 평문 X 배의 블록 크기를 만들기 위해서입니다. Bouncy Castle에는 없기 때문에 직접 프로그래밍해야합니다. 따라서 패딩 모드를 사용하지 마십시오. 해독 된 일반 텍스트의 오른쪽에 0 바이트를 제거하십시오.
  • mcrypt_decrypt(MCRYPT_RIJNDAEL_256) : 아마 누군가가 이것이 AES-256을 의미한다고 생각했을 것입니다. 블록 크기가 256 비트 인 Rijndael입니다.
  • MD5($key) 누군가 256 비트의 키 재료가 필요하고 암호를 통한 MD5 값의 16 진수 인코딩이 충분하다고 생각했습니다. 그것은 단지 엔트로피의 절반 (바이트 당 2 진수 문자)만을 제공하기 때문에 그렇지 않습니다. 괜찮아도, 기대 기본 64 인코딩, 경우
  • MCRYPT_MODE_CBC ASCII 호환 텍스트로 존재하는 데 필요한 암호문 : 그와 MD5 암호 해시 함수가 아니라는 사실이 솔직에서 가장
  • base64_decode($encoded_string)한다 : 괜찮아요.하지만 PHP는 주로 웹 언어로 사용되기 때문에 메시지가 오라클/일반 텍스트 오라클 공격에 취약 할 것으로 예상됩니다. 물론 암호문을 변경하면 감지되지 않아야합니다.
  • md5(md5($key)) : 적용 MD5를 두 번 사용하면 제로 IV보다 안전하지 않으며 16 진수 변환도 잊지 말아야합니다. 다행히 그는 IV가 적어도 256 비트 대신 128 비트

것을 의미 않습니다 그래서 당신은 사용할 필요가 :

new BufferedBlockCipher(new RijndaelEngine(256)) 

를 탄력 성 경량 API에.

해피 코딩, 당신은 자바가 좋으므로이 코드는 간단해야합니다. 최대한 빨리이 완벽한 허튼 소리에서 업그레이드하십시오.

+0

두 번째 점에 유의하십시오 : Rijndael-256은 확장 (12.)으로 [표준화] (http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf)입니다. javax가 구현을 제공하지 않는다는 것입니다. –

+0

@ArtjomB. 아니요, Rijndael-256은 저자가 잘 정의했습니다. 문제가 아니며 NIST에서 "고급 암호화 표준"으로 표준화되지 않았습니다. * 제안 *을 가리키고 있음에 유의하십시오. –

+0

좋아, * 표준화 된 * 조금 많습니다. 제안 외에도 Rijndael의 최종 버전이 있습니까? –