2014-04-23 4 views
2

Ruby의 OpenSSL 라이브러리를 표준 Linux 명령 줄 openssl과 조정하는 데 어려움이 있습니다.Ruby OpenSSL 대 Linux openssl

는 내가 여기서 할 노력하고있어 암호 는 foobar와 문자열 mysecretstring를 암호화하지만 먼저합니다 (aescrypt gem의 코드를 흉내) SHA256을 사용하여 암호를 해시입니다. 여기

내가 IRB에서 할 것입니다 :

2.0.0-p353 :041 > aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC") 
=> #<OpenSSL::Cipher::Cipher:0x000000026b8d50> 
2.0.0-p353 :042 > aes.encrypt 
=> #<OpenSSL::Cipher::Cipher:0x000000026b8d50> 
2.0.0-p353 :043 > aes.key=OpenSSL::Digest::SHA256.new('foobar').digest 
=> "\xC3\xAB\x8F\xF17 \xE8\xAD\x90G\xDD9Fk<\x89t\xE5\x92\xC2\xFA8=J9`qL\xAE\xF0\xC4\xF2" 
2.0.0-p353 :044 > Base64.encode64(aes.update('mysecretstring')+aes.final) 
=> "305V0Kbklj/HoBSK4ferhA==\n" 
2.0.0-p353 :045 > 

지금까지 너무 좋아. 이제 나는 이것이 리눅스 명령 행에서 openssl로 할 수있는 것과 어떻게 일치하는지보고 싶다. 마지막 두 단계에서 내가 첫 번째 단계에서 암호 '는 foobar'를 해싱하여 얻은 문자열 c3:ab:8f:f1:37:20:e8:ad:90:47:dd:39:46:6b:3c:89:74:e5:92:c2:fa:38:3d:4a:39:60:71:4c:ae:f0:c4:f2 를 붙여

[(master)]$ echo -n "foobar" | openssl dgst -sha256 -c 
(stdin)= c3:ab:8f:f1:37:20:e8:ad:90:47:dd:39:46:6b:3c:89:74:e5:92:c2:fa:38:3d:4a:39:60:71:4c:ae:f0:c4:f2 
[(master)]$ echo -n "mysecretstring" | openssl enc -e -aes-256-cbc -a 
enter aes-256-cbc encryption password: 
Verifying - enter aes-256-cbc encryption password: 
U2FsdGVkX18EOcTrTMNQuCRnstUe6oY9b5RLuTOFcNo= 
[(master)]$ 

.

왜 내가 동일한 대답을 얻지 못했고, 더 중요한 것은 리눅스 cmd에서 루비에서 얻은 것을 모방하기 위해 무엇을해야 하는가?

답변

1

openssl 행에 -K 옵션을 사용해야합니다. 그런 다음 16 진수 키를 제공 할 수 있습니다. 그렇지 않으면 OpenSSL은 자체의 키 유도 메커니즘을 사용하여 암호에서 키를 파생시킵니다. -K을 제공 할 때는 -iv도 제공해야합니다. 이 경우 호환되도록 IV는 0으로 설정된 16 바이트로 구성되어야합니다. owlstead

echo -n "mysecretstring" | openssl enc -e -aes-256-cbc -a -K c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2 -iv 00000000000000000000000000000000 
+0

감사 :

그래서 다음 줄을보십시오. 나는 아직도 그것을 얻지 않고있는 I 'm를 추측한다. 정확히 어떻게 iv를 지정합니까? 나는 다음과 같은 것을 시도한다 : echo -n "mysecretstring"| openssl enc -e -aes-256-cbc -a -K c3 : ab : 8f : f1 : 37 : 20 : e8 : ad : 90 : 47 : dd : 39 : 46 : 6b : 3c : 89 : 74 : e5 : 92 : c2 : fa : 38 : 3d : 4a : 39 : 60 : 71 : 4c : ae : f0 : c4 : f2 -iv 00 : 00 : 00 : 00 : 00 : 00 : 00 : 00 : 00 : 00 00 : 00 : 00 : 00 : 00하지만 16 진수 문자열이 너무 길다는 오류가 발생합니다. 내가 그것을 단축하면 그것은 유효하지 않은 16 진수 4 값이됩니다. 나는 정말로 더 명확한 점을 높이 평가할 것이다. 당신의 도움을 주셔서 감사합니다. –

+0

매개 변수에 대한 OpenSSL 명령 줄 문서를 읽으려고 했습니까? –

+0

16 진수 중간에 이상한 유니 코드 문자를 밀수입했습니다. 그들은 심지어 사이트에 복사되었다 :) 커서가 계속 그들에게 매달려 있었기 때문에 발견되었다. 이것은 아마도'digest'에 의해 반환 된 문자열 때문일 것입니다. 왜냐하면 당신이 내용을 필요로한다면 수동으로 16 진수로 출력하는 것이 더 좋습니다. –