2016-12-16 36 views
8

OPENSSL_ZERO_PADDING 문제 :

$string = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv); 

내가 좋아하는 것은 openssl_encrypt 하나에 mcrypt_encrypt 전화를 변경하려면 이것을 미래에 증명할 것입니다.

$mode = 'des-ede3-cbc' 또는 $mode = '3DES';$options = true을 사용하면 더 비슷한 응답을 얻을 수 있지만 동일하지는 않습니다. 완벽한 일치를 얻기 위해 전화하는 다른 방법이 있습니까? Mcrypt 라이브러리에 대한

...

은 내가가 lorem-ipsum의 $message + $key 조합이 (base64_encoded) 받고 있어요, 그래서 하나 개의 함수를 믿기 시작하고 또는 다른 암호화하기 전에 약간 메시지를 패딩

OpenSSL에 대한

대 "Y + + JgMBdfI7ZYY3M9lJXCtb5Vgu rWvLBfjug2GLX7uo ="

"Y + JgMBdfI7ZYY3M9lJXCtb5Vgu + rWvLBvte4swdttHY ="

빈 문자열 (참OPENSSL_RAW_DATA, 또는 ) 결과를 OPENSSL_ZERO_PADDING을 통과 $ 옵션을 사용하지만, 1 아무것도하지만 전달 시도 ...

OPENSSL_ZERO_PADDINGOPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING 작업을 사용하여

어느 ... :(

,536,

다른 단서가 있습니까? "OpenSSL 1.0.2g 1 Mar 2016"을 사용하고 있습니다.

이미 this q &을 읽었지 만 도움이되지 않습니다. 패딩 문제가있는 onlyone이 아니지만 지금까지 해결 방법이 없습니다. (두 번째 대답은 정말

+0

절대로 완벽하게 일치 시켜서는 안됩니다. 이것이 초기화 벡터의 용도입니다. ** 동일한 ** 알고리즘과 ** 동일한 ** 키를 사용하여 ** 동일한 ** 페이로드를 암호화 할 때마다 안전하고 싶다면 완전히 다른 출력을 얻어야합니다. 동일한 입력에 대해 동일한 출력을 얻으면 암호화가 약합니다. 그것이 암호화의 IV 포인트입니다. 암호화가되면 IV로 암호화 된 페이로드를 상대방에게 전달합니다. – Mjh

+1

동일한 페이로드를 사용하고있는 경우 동일한 algo, 같은 IV; 나는 같은 출력을 얻어야한다고 생각한다. 각 호출마다 서로 다른 IV를 사용해야한다는 것에 신경 쓰지 마십시오. 두 호출 (mcrypt 및 openssl)에 동일한 IV를 사용하면 동일한 출력을 얻어야합니다. 맞습니까? 출력물 구걸이 동일하기 때문에 메시지 패딩과 관련 있다고 생각하기 시작했습니다. – yivi

+0

모든 것이 동일하다면 동일한 출력을 얻고 있어야합니다. 'openssl_encrypt'에 대한 네 번째 매개 변수는 패딩을 제어합니다. 당신은'$ encrypted = openssl_encrypt ($ data, $ alg, $ key, OPENSSL_ZERO_PADDING, $ iv);로 암호화 할 수 있으며 같은 출력을 얻었는지 확인합니다. [www.php.net/openssl_encrypt](http://www.php.net/openssl_encrypt)에서, 네 번째 매개 변수를 사용하는 방법을 보려면 주석을 읽을 수 있습니다. – Mjh

답변

13

mcrypt_encrypt 제로 패드를 입력 데이터 블록 크기의 배수가 아니라면 데이터 그 자체가 0 인 경우 모호한 결과가 발생합니다. 분명히 OpenSSL은이 경우에 제로 패딩을 사용하는 것을 허용하지 않습니다. 이는 잘못된 반환 값을 설명합니다.

패딩을 수동으로 추가하여이를 피할 수 있습니다.

$message = "Lorem ipsum"; 
$key = "123456789"; 
$iv = "12345678"; 

$message_padded = $message; 
if (strlen($message_padded) % 8) { 
    $message_padded = str_pad($message_padded, 
     strlen($message_padded) + 8 - strlen($message_padded) % 8, "\0"); 
} 
$encrypted_mcrypt = mcrypt_encrypt(MCRYPT_3DES, $key, 
    $message, MCRYPT_MODE_CBC, $iv); 
$encrypted_openssl = openssl_encrypt($message_padded, "DES-EDE3-CBC", 
    $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv); 

printf("%s => %s\n", bin2hex($message), bin2hex($encrypted_mcrypt)); 
printf("%s => %s\n", bin2hex($message_padded), bin2hex($encrypted_openssl)); 

이것은 모두 동일하게 인쇄됩니다.

4c6f72656d20697073756d => c6fed0af15d494e485af3597ad628cec 
4c6f72656d20697073756d0000000000 => c6fed0af15d494e485af3597ad628cec 
+0

그래,하지만이게 내가 할 수없는 메시지를 수정하고'mcrypt_' 응답을'openssl_'과 일치하도록 변경하는 것입니다 (이것은 내가 원한 것의 반대입니다,'openssl_' 응답 mcrypt가 필요합니다) – yivi

+0

mcrypt는 내부적으로 패딩을 추가합니다. OpenSSL 용 문자열을 채워 넣기 만하면됩니다. 나는 이것을 명확히하기 위해 나의 대답을 수정할 것이다. – Joe

+0

좋아 보인다. 전화로. 몇 시간 후에 시험해 보겠습니다. – yivi

-2

mcrypt_encrypt 블록 크기에 패드 메시지에 제로를 사용하려면 openssl 암호화 통화에서 패딩을 ... 제거 원하는 것, 약 통화를 Mcrypt 라이브러리에 패딩을 추가하는 이야기. 당신이 제로를 추가 할 수 있도록 당신의 원시 데이터의 꼬리 한 다음 블록을 암호화합니다.

작동합니다 OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING 사용. 그렇지 않은 경우에, 당신은 자신에 의해 해독 된 데이터에서 패딩을 제거 할 수 있습니다.

+2

10k 담당자, 적절한 형식을 사용하십시오. x_x – DanFromGermany

+0

왜 시간을 들여야합니까? –

+0

'OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING'이 (가) 작동하지 않습니다. 아마 phps openssl 구현이나 뭐 그런 버그일까요? 암호화되지 않은 데이터에서 여분의 문자를 제거하는 것은 저에게 효과적이지 않습니다. 이 문자열은 확인 서명으로 사용됩니다. 하나의 데이터와 일부 데이터가 제공되며이 암호화 된 데이터를 만들어 수신 된 서명과 일치시킵니다. 나는 다른 쪽 시스템을 제어하지 않는다. openssl_와 일치하는 mcrypt_ 호출을 수정해도 mcrypt_와 일치하는 openssl_이 필요합니다. – yivi