2017-12-12 11 views
1

이 질문은 파트 2를 my previous question으로 돕습니다.
나는 유사한 질문을 가진 다른 스레드를 보았지만 PHP (즉, mcrypt 제거)의 최근 변경으로 인해 2017/18에서 OpenSSL을 사용하는 것이 가장 좋은 방법에 대한 조언을 구하고 있습니다.터미널에서 PHP로 생성 된 OpenSSL 문자열의 암호 해독

저는 PHP 스크립트에서 다음 기능을 고안했습니다. 일반 텍스트 문자열을 가져 와서 암호화합니다.

<?php 
function encrypt($myString) { 
    $data = $myString; 
    $key = 'B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF'; 
    $iv = '61736466673534336173646667353433'; 

    $encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, 0, hex2bin($iv)); 
    return $encrypted; 
} 
?> 

결과 : 6Q7DM7VGEeJdnGf2h9k1Kg의 ==

내 질문은 매우 간단합니다 : 그것의 일반 텍스트로 다시 위의 결과를 돌려 터미널 해독 상응하는 무엇입니까? 에서 (이 encrypted 설정 그대로 작동하는 동안, 그러나

set encKey to "B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF" 
set encIV to "61736466673534336173646667353433" 
set stringToEnc to "my plain text string" 

set encrypted to (do shell script "echo '" & stringToEnc & "' | openssl enc -aes-256-cbc -a -K " & encKey & " -iv " & encIV) 
set decrypted to (do shell script "echo '" & encrypted & "' | openssl enc -aes-256-cbc -a -d -K " & encKey & " -iv " & encIV) 

:

지금까지 내가 (빠른 변수 조작에 대한) 애플 스크립트에서 다음 터미널 명령을 사용할 수있게했지만 do shell script 내용은 터미널 코드 PHP 함수의 출력 위의 스크립트가),이 오류가 발생합니다 :

bad decrypt 140735624655752:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22/libressl/crypto/evp/evp_enc.c:529:

가 SO에 this, that 및 이와 유사한 질문에 여기 공부 한을, 나는 의아해 WH 오전 y 오류가 계속 발생합니다. 나는 그것이 keyiv (내가 PHP에서 hex2bin()을 사용했음을 노트) 인코딩 때문에 사용하지 않으면 다른 결과가 나올 것이라고 생각한다.

내 터미널 명령에 무엇이 누락 되었습니까? 누군가가 암호 해독을 해결하는 데 도움을 줄 수 있다면 도움을 주시면 감사하겠습니다.

답변

1

마지막 질문과 마찬가지로, 인코딩과 약간 어려움을 겪고 있습니다. openssl_encrypt에 대한 설명서를 자세히 살펴보면 키와 IV가 모두 16 진수가 아닌 원시 값으로 전달되어야한다는 것을 알게됩니다.

코드에서 IV가 있지만 코드는 올바르게 입력했습니다. 이 키를 16 진수 값으로 전달 했으므로 필요한 길이의 두 배가되었습니다. 총 512 비트의 키 자료를 전달 했으므로 여기서는 B374A26A71490437AA024E4FADD5B497 키의 처음 256 비트 만 사용됩니다.

ASCII 인코딩 된 원시 키는 정확히 256 비트 인 B374A26A71490437AA024E4FADD5B497입니다. 그러나 첫 번째 질문에서 언급 한 OpenSSL -K 플래그는 키가 16 진수로 인코딩되어야하므로 16 진수로 인코딩해야합니다. 따라서 우리는 B374A26A71490437AA024E4FADD5B497을 16 진수로 인코딩하여 실제 16 진수로 인코딩 된 암호화 키인 4233373441323641373134393034333741413032344534464144443542343937을 얻습니다.

그래서, 요약, 마지막 명령은 내가 올바른 가정 단지 바이트 0x70의 출력을 제공하는이입니다 :

openssl enc -d -K 4233373441323641373134393034333741413032344534464144443542343937 -iv 61736466673534336173646667353433 -in input.bin -out out.bin 

이것은 input.bin은 Base64로의 바이너리를 디코딩 있다고 가정을 당신이 제공 한 base64 암호문.