RSA 및 OpenSSL로 메시지 / 텍스트를 암호화하는 방법은 무엇입니까?


29

Alice의 공개 키가 있습니다. Alice에게 RSA 암호화 된 메시지를 보내려고합니다. openssl명령을 사용하여 어떻게 할 수 있습니까?

메시지는 다음과 같습니다

안녕 앨리스! 저녁 식사로 malacpörkölt를 지참하십시오!

답변:


36

에서 하려면 openssl 설명서 ( openssl매뉴얼 페이지), 검색 RSA, 당신은 RSA 암호화를위한 명령이라고 볼 수 있습니다 rsautl. 그런 다음 rsautl매뉴얼 페이지 를 읽고 구문을 확인하십시오.

echo 'Hi Alice! Please bring malacpörkölt for dinner!' |
openssl rsautl -encrypt -pubin -inkey alice.pub >message.encrypted

기본 패딩 구성표 는 원래 PKCS # 1 v1.5 (여전히 많은 프로 코톨에서 사용됨)입니다. openssl은 OAEP (현재 권장) 및 원시 암호화 (특별 상황에서만 유용)도 지원합니다.

openssl을 직접 사용하는 것이 대부분 연습입니다. 실제로는 gpg (RSA를 사용하지만 메시지를 직접 암호화하지는 않음) 와 같은 도구 를 사용합니다.


사용에 문제가 openssl있습니까?
Bratchley

2
@Bratchley openssl명령 줄 도구는 여러 명령이 혼합되어 있습니다. 대부분 인증서를 조작하는 인증서 중 일부는 유용 할 수 있지만 구문과 매개 변수가 기발하기 때문에 올바르게 사용하기가 어렵습니다. 와 같은 일부 rsautl는 훌륭하지만 유용한 기능을 제공하지 않으며 원시 암호화 기본 요소 만 노출합니다. 예를 들어 RSA 암호화는 하이브리드 암호화를 위해 대칭 키를 암호화하는 데만 사용됩니다. 와 같은 일부 enc는 안전하게 사용하기가 어렵고 존재하지 않으면 세상이 더 나아질 것입니다.
Gilles 'SO- 악마 그만'

좋은 대답입니다. 저도 같은 ... OpenSSL을 rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep 지정, 그리고 해독에이 플래그 -oaep와 패딩 추가 된
rustyMagnet

24

먼저 좋은 암호화를 원한다면 GnuPG를 살펴보십시오 . 그러나 실험을하고 작동 방식을 배우려면 RSA 가 무엇인지 이해해야합니다 . RSA는 임의의 문자열을 암호화하도록 설계되지 않았으며 정수를 암호화하는 알고리즘입니다. 특히, 0에서 n-1 사이의 정수. 여기서 n은 공개 키의 모듈러스 값입니다. 1024 비트 인 RSA 키에 대해 이야기 할 때, 모듈러스를 이진수로 저장하려면 1024 비트가 필요합니다. 이것이 RSA가 DES 또는 AES 와 같은 대칭 키 암호와 함께 사용되는 이유 중 하나입니다.. AES에 대해 임의의 256 비트 키를 생성하고 1024 비트 RSA 공개 키로 해당 키를 암호화 할 수 있습니다. 그런 다음 개인 키에 액세스하는 사람은 누구나 대칭 키를 추출하고 AES로 메시지를 디코딩 할 수 있습니다. RSA의 전체 표준을 PKCS # 1 이라고합니다 .

또한 DES와 AES는 블록 암호입니다. 특정 크기의 블록으로 만 데이터를 암호화합니다. DES는 64 비트 블록을 사용하고 AES는 128 비트 블록을 사용합니다. 블록 이상을 암호화하려면 CBC 또는 CTR과 같은 작동 모드 를 사용해야합니다 . 이 모드는 블록 모드 암호를 사용하여 비트 스트림을 암호화하는 방법을 지정합니다.

마지막으로, 수신중인 데이터를 확인하는 것이 중요합니다. 공격자는 전송중인 데이터를 읽을 수 없지만 무결성이나 신뢰성이 데이터 스트림에 적용되지 않으면 탐지없이 비트를 뒤집을 수 있습니다. 공격자는 포트 443에 대한 SSL 연결이 웹 페이지 요청 일 가능성이 높다는 것을 쉽게 추측 할 수 있으며 나머지 암호화를 방해하지 않고 GET /비트 변경을 뒤집을 수 PUT /있습니다. 무결성에 대한 간단한 접근 방식은 끝에 MD5 또는 SHA-1 합계를 추가하는 것이지만 데이터 신뢰성이 아닌 데이터 무결성 만 제공합니다. 데이터 스트림을 완전히 알고있는 사람이라면 누구나 정확한 합계를 생성 할 수 있습니다. 더 안전한 접근 방식은 HMAC 와 같은 키 해시를 사용하는 것입니다 무결성에 추가하여 데이터 인증을 제공하기 위해 비밀 키에 대한 지식이 필요합니다.


2
이것은 정말 좋습니다
mko

5

아래에서 나열된 알고리즘 또는 RSA 중 원하는 알고리즘을 지정할 수 있습니다 (OpenSSL에서 RSA에 사용하는 정확한 이름을 모르더라도)

"openssl enc -help"를 사용하여 시스템에서 지원되는 암호 목록을 가져 와서 인수로 전달하십시오. 예 : "-aes256"

내 시스템에는 적어도 해당 이름으로 RSA가 없습니다.


S / MIME 메시지를 어떻게 암호화합니까?

누군가 자신의 공개 인증서를 보내서 메시지를 암호화하도록 요청한다고 가정 해 봅시다. 그녀의 인증서를 her-cert.pem으로 저장했습니다. 회신을 my-message.txt로 저장했습니다.

RC2-40 암호화는 상당히 약하지만 기본값을 얻으려면 openssl에 메시지와 인증서가있는 위치를 알려주십시오.

openssl smime her-cert.pem -encrypt -in 내 메시지 .txt

원격 통신원에게 강력한 SSL 툴킷이 있다고 확신하는 경우 트리플 DES와 같은 강력한 암호화 알고리즘을 지정할 수 있습니다.

openssl smime her-cert.pem -encrypt -des3 -in-my-message.txt

기본적으로 메일 헤더를 포함하여 암호화 된 메시지는 표준 출력으로 전송됩니다. -out 옵션 또는 쉘을 사용하여 파일로 경로 재 지정하십시오. 또는 훨씬 까다로운 경우 출력을 직접 sendmail로 파이프하십시오.

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <you@youraddress.com>' \
   -to 'Her Fullname <her@heraddress.com>' \
   -subject 'My encrypted reply' |\
 sendmail her@heraddress.com

S / MIME 메시지에 어떻게 서명합니까?

전체 메시지를 암호화 할 필요는 없지만 수신자가 메시지의 무결성을 보장 할 수 있도록 서명하려는 경우 레시피는 암호화와 비슷합니다. 가장 큰 차이점은받는 사람의 인증서로 서명 할 수 없으므로 자신의 키와 인증서가 있어야한다는 것입니다.

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <you@youraddress.com>' \
   -to 'Her Fullname <her@heraddress.com>' \
   -subject 'My signed reply' |\
 sendmail her@heraddress.com

( http://www.madboa.com/geek/openssl/에서 )

(er ... 모든 백 슬래시-줄 바꿈을 피해야합니다. 여기 편집 상자에 잘 표시되므로 무슨 일이 일어나고 있는지 잘 모르겠습니다!


1
줄 바꿈을 유지하려면 각 줄의 시작 부분에 4 개의 공백을 두어야합니다. 방법을 보여주기 위해 첫 번째 블록을 변경했습니다. 두 번째를 고칠 수 있습니까?
Mikel

1
대칭 암호화 전용 openssl enc이므로 RSA를 찾지 못했습니다 enc. 예, openssl의 옵션은 잘 정리되어 있지 않습니다. 비대칭 알고리즘에는 rsa/ dsa/ dh키 조작, rsautl/ dsautl암호화 / 암호 해독 / 확인 / 서명 및 genrsa/ gendsa/ gendh키 생성 명령이 있습니다.
Gilles 'SO- 악한 중지'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.