공개 키를 사용하여 openssl에서 대용량 파일을 암호화하는 방법


78

개인 키를 가진 사람 외에 다른 사람이 해독 할 수 없도록 공개 키로 대용량 파일을 암호화하려면 어떻게해야합니까?

RSA 공개 및 개인 키를 만들 수 있지만 다음 명령을 사용하여 대용량 파일을 암호화 할 때 :

openssl rsautl -encrypt -pubin -inkey public.pem -in myLargeFile.xml -out myLargeFile_encrypted.xml

그리고 어떻게 해독을 수행 할 수 있습니까? ...

다음 명령으로 개인 및 공개 키를 만듭니다.

openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

이 오류가 발생합니다.

RSA operation error
3020:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:.\crypto\rsa\rsa_pk1.c:151:

나는 1024 비트에서 1200 비트 사이의 크기로 키를 만들려고했지만 운이없고 동일한 오류가 발생했습니다.

답변:


82

공개 키 암호화는 임의의 긴 파일을 암호화하기위한 것이 아닙니다. 하나는 대칭 암호 (예 : AES)를 사용하여 일반 암호화를 수행합니다. 새로운 무작위 대칭 키가 생성되고 사용 된 후 RSA 암호 (공개 키)로 암호화 될 때마다. 암호화 된 대칭 키와 함께 암호문이 수신자에게 전송됩니다. 받는 사람은 개인 키를 사용하여 대칭 키를 해독 한 다음 대칭 키를 사용하여 메시지를 해독합니다.

개인 키는 공유되지 않으며 임의 대칭 암호를 암호화하는 데 공개 키만 사용됩니다.


1
그러나 비대칭 암호화의 요점은 개인 비밀의 공유를 방지하는 것입니다.이 접근 방식은 비대칭 암호화로 암호화 된 경우에도 키 공유로 이어집니다. 공유 비밀을 암호화하는 데 RSA와 같은 비대칭 암호화를 사용하는 것이 대칭 알고리즘과 비교하면 어떤 이점이
있습니까?

3
@techno : 당신은 어떤 비밀도 공유하지 않습니다. 일회성 임의 키를 생성하고이를 사용하여 단일 메시지를 암호화 한 후 버립니다. 메시지와 함께 보내는 키는 해당 메시지에만 유효합니다.
n. '대명사'm.

1
예,하지만 특정 메시지에 대한 일회성 키가 바로 공유됩니까? RSA와 같은 비대칭 암호화를 사용하여 공유 비밀과 대칭 알고리즘을 암호화하는 데 어떤 이점이 있습니까
techno

7
예. 또한 메시지 자체를 공유합니다. 키를 공유하는 것이 두렵다면 메시지도 공유하지 마십시오.
n. '대명사'm.

1
@nm "공개 키 암호화는 임의로 긴 파일을 암호화하기위한 것이 아닙니다.", 엄격하게 성능 관점에서? 수신자 (또는 파일을 읽어야하는 사람) 의 공개 키를 사용하여 전체 파일을 RSA 암호화하면 다른 단점이 발생합니까?
cYrus

73

OpenSSL 및 명령 줄에서 모든 파일을 안전하고 높은 보안으로 인코딩하는 솔루션 :

PEM 형식의 파일을 암호화하기 위해 X.509 인증서를 준비해야합니다.

파일 암호화 :

openssl smime -encrypt -binary -aes-256-cbc -in plainfile.zip -out encrypted.zip.enc -outform DER yourSslCertificate.pem

무엇입니까 :

  • smime -S / MIME 유틸리티 용 ssl 명령 ( smime (1) )
  • -encrypt- 파일 처리를 위해 선택한 방법
  • -binary- 안전한 파일 프로세스를 사용합니다. 일반적으로 입력 메시지는 S / MIME 사양에 따라 "표준"형식으로 변환되며이 스위치는이를 비활성화합니다. 모든 바이너리 파일 (예 : 이미지, 사운드, ZIP 아카이브)에 필요합니다.
  • -aes-256-cbc- 암호화를 위해 256 비트에서 선택한 암호 AES (강력 함). 지정하지 않으면 40 비트 RC2가 사용됩니다 (매우 약함). ( 지원되는 암호 )
  • -in plainfile.zip- 입력 파일 이름
  • -out encrypted.zip.enc- 출력 파일 이름
  • -outform DER- 출력 파일을 바이너리로 인코딩합니다. 지정하지 않으면 파일이 base64로 인코딩되고 파일 크기가 30 % 증가합니다.
  • yourSslCertificate.pem- 인증서의 파일 이름입니다. PEM 형식이어야합니다.

이 명령은 형식에 관계없이 큰 파일을 매우 효과적으로 강력하게 암호화 할 수 있습니다.
알려진 문제 : 대용량 파일 (> 600MB)을 암호화하려고하면 문제가 발생합니다. 오류가 발생하지 않지만 암호화 된 파일이 손상됩니다. 항상 각 파일을 확인하십시오! (또는 PGP 사용-공개 키로 파일 암호화를 더 많이 지원함)

파일 해독 :

openssl smime -decrypt -binary -in encrypted.zip.enc -inform DER -out decrypted.zip -inkey private.key -passin pass:your_password

무엇입니까 :

  • -inform DER- 위의 -outform과 동일
  • -inkey private.key- 개인 키의 파일 이름입니다. 이는 PEM 형식이어야하며 암호로 암호화 할 수 있습니다.
  • -passin pass : your_password- 개인 키 암호화를위한 비밀번호입니다. ( 암호 인수 )

1
위의 명령을 수행하면 Usage smime [options] yourSslCertificate.pem ...모든 smime 옵션이 표시됩니다.
Brian Armstrong

4
내가 -aes256대신 해야하는 것으로 밝혀졌다-aes-256-cbc
Brian Armstrong

9
"이 명령은 크기 나 형식에 관계없이 모든 파일을 매우 효과적으로 강력하게 암호화 할 수 있습니다."그러나 마지막 단락에서는 큰 파일을 전혀 암호화 할 수 없다는 사실을 인정합니다. 결국 솔루션이 대용량 파일에 대해 작동하지 않을 때 모든 파일. 솔루션으로 끝내기보다는 솔루션의 한계와 범위에서 시작해야합니다.
Timo 2014 년

2
600MB를 초과하는 대용량 파일의 알려진 문제에 대한 버그 보고서가 있습니까? 공개 키만 사용할 수있는 경우 암호화 된 파일을 확인할 수 없습니다.
Sampo

이것은 위험한 해결책입니다. 큰 파일 (> 2GB)에 대한 정보 손실로 이어집니다. 먼저 큰 파일을 분할해야합니다
l0pan

30

.NET을 사용하여 대용량 파일을 직접 암호화 할 수 없습니다 rsautl. 대신 다음과 같이하십시오.

  1. openssl rand예를 들어를 사용하여 키를 생성합니다 .openssl rand 32 -out keyfile
  2. 다음을 사용하여 키 파일 암호화 openssl rsautl
  3. openssl enc1 단계에서 생성 된 키를 사용 하여 를 사용하여 데이터를 암호화합니다 .
  4. 암호화 된 데이터로 암호화 된 키 파일을 패키징하십시오. 수신자는 개인 키로 키를 해독 한 다음 결과 키로 데이터를 해독해야합니다.

28

http://www.czeskis.com/random/openssl-encrypt-file.html 의 지침이 유용하다는 것을 알았습니다 .

예제의 파일 이름으로 링크 된 사이트를 의역하려면 :

대용량 파일을 암호화 할 수 있으므로 대칭 키 생성

openssl rand -base64 32 > key.bin

대칭 키를 사용하여 대용량 파일 암호화

openssl enc -aes-256-cbc -salt -in myLargeFile.xml \
  -out myLargeFile.xml.enc -pass file:./key.bin

다른 사람에게 안전하게 보낼 수 있도록 대칭 키를 암호화합니다.

openssl rsautl -encrypt -inkey public.pem -pubin -in key.bin -out key.bin.enc

아무도 찾을 수 없도록 암호화되지 않은 대칭 키를 폐기하십시오.

shred -u key.bin

이 시점에서 암호화 된 대칭 키 ( key.bin.enc)와 암호화 된 대용량 파일 ( myLargeFile.xml.enc)을 상대방에게 보냅니다.

그러면 다른 사람은 다음을 사용하여 개인 키로 대칭 키를 해독 할 수 있습니다.

openssl rsautl -decrypt -inkey private.pem -in key.bin.enc -out key.bin

이제 대칭 키를 사용하여 파일을 해독 할 수 있습니다.

openssl enc -d -aes-256-cbc -in myLargeFile.xml.enc \
  -out myLargeFile.xml -pass file:./key.bin

그리고 당신은 끝났습니다. 다른 사람이 해독 된 파일을 가지고 있고 안전하게 전송되었습니다.


1
이것이 최상의 솔루션입니다. 상단 위를 기록하고 허용 대답 했어야

22

-stream 옵션을 사용하여 대용량 파일을 암호화 할 수 있지만 하드웨어 제한으로 인해 결과 파일을 해독 할 수 없으므로 smime을 사용하여 매우 큰 파일을 암호화하는 것은 권장되지 않습니다 . 큰 파일 해독 문제 참조

위에서 언급했듯이 공개 키 암호화는 임의로 긴 파일을 암호화하기위한 것이 아닙니다. 따라서 다음 명령은 암호 구문을 생성하고 대칭 암호화를 사용하여 파일을 암호화 한 다음 비대칭 (공개 키)을 사용하여 암호 구문을 암호화합니다. 참고 : smime에는 암호 구문을 암호화하기위한 기본 공개 키 및 백업 키 사용이 포함됩니다. 백업 공개 / 개인 키 쌍은 신중할 것입니다.

임의 암호 생성

RANDFILE 값을 현재 사용자가 액세스 할 수있는 파일로 설정하고 passwd.txt 파일을 생성하고 설정을 정리합니다.

export OLD_RANDFILE=$RANDFILE
RANDFILE=~/rand1
openssl rand -base64 2048 > passwd.txt
rm ~/rand1
export RANDFILE=$OLD_RANDFILE

암호화

아래 명령을 사용하여 passwd.txt 내용을 암호로 사용하고 AES256을 base64 (-a 옵션) 파일로 사용하여 파일을 암호화합니다. 기본 공개 키 및 백업 키를 사용하여 비대칭 암호화를 사용하여 passwd.txt를 파일 XXLarge.crypt.pass로 암호화합니다.

openssl enc -aes-256-cbc -a -salt -in XXLarge.data -out XXLarge.crypt -pass file:passwd.txt
openssl smime -encrypt -binary -in passwd.txt -out XXLarge.crypt.pass -aes256 PublicKey1.pem PublicBackupKey.pem
rm passwd.txt

복호화

복호화는 XXLarge.crypt.pass를 passwd.tmp로 복호화하고 XXLarge.crypt를 XXLarge2.data로 복호화 한 다음 passwd.tmp 파일을 삭제합니다.

openssl smime -decrypt -binary -in XXLarge.crypt.pass -out passwd.tmp -aes256 -recip PublicKey1.pem -inkey PublicKey1.key
openssl enc -d -aes-256-cbc -a -in XXLarge.crypt -out XXLarge2.data -pass file:passwd.tmp
rm passwd.tmp

이것은> 5GB 파일에 대해 테스트되었습니다 ..

5365295400 Nov 17 10:07 XXLarge.data
7265504220 Nov 17 10:03 XXLarge.crypt
      5673 Nov 17 10:03 XXLarge.crypt.pass
5365295400 Nov 17 10:07 XXLarge2.data

3

대용량 파일 (> 600MB)을 안전하게 암호화하려면 openssl smime각 파일을 작은 청크로 분할해야합니다.

# Splits large file into 500MB pieces
split -b 500M -d -a 4 INPUT_FILE_NAME input.part.

# Encrypts each piece
find -maxdepth 1 -type f -name 'input.part.*' | sort | xargs -I % openssl smime -encrypt -binary -aes-256-cbc -in % -out %.enc -outform DER PUBLIC_PEM_FILE

정보를 위해 다음은 모든 조각을 해독하고 통합하는 방법입니다.

# Decrypts each piece
find -maxdepth 1 -type f -name 'input.part.*.enc' | sort | xargs -I % openssl smime -decrypt -in % -binary -inform DEM -inkey PRIVATE_PEM_FILE -out %.dec

# Puts all together again
find -maxdepth 1 -type f -name 'input.part.*.dec' | sort | xargs cat > RESTORED_FILE_NAME

3

n. 'pronouns' m.의 답변에 대한 자세한 설명 에서

공개 키 암호화는 임의의 긴 파일을 암호화하기위한 것이 아닙니다. 하나는 대칭 암호 (예 : AES)를 사용하여 일반 암호화를 수행합니다. 새로운 무작위 대칭 키가 생성되고 사용 된 후 RSA 암호 (공개 키)로 암호화 될 때마다. 암호화 된 대칭 키와 함께 암호문이 수신자에게 전송됩니다. 받는 사람은 개인 키를 사용하여 대칭 키를 해독 한 다음 대칭 키를 사용하여 메시지를 해독합니다.

암호화 의 흐름이 있습니다 .

+---------------------+      +--------------------+
|                     |      |                    |
| generate random key |      |   the large file   |
|        (R)          |      |        (F)         |
|                     |      |                    |
+--------+--------+---+      +----------+---------+
         |        |                     |
         |        +------------------+  |
         |                           |  |
         v                           v  v
+--------+------------+     +--------+--+------------+
|                     |     |                        |
| encrypt (R) with    |     | encrypt (F)            |
| your RSA public key |     | with symmetric key (R) |
|                     |     |                        |
|  ASym(PublicKey, R) |     |     EF = Sym(F, R)     |
|                     |     |                        |
+----------+----------+     +------------+-----------+
           |                             |
           +------------+ +--------------+
                        | |
                        v v
         +--------------+-+---------------+
         |                                |
         |   send this files to the peer  |
         |                                |
         |     ASym(PublicKey, R) + EF    |
         |                                |
         +--------------------------------+

그리고 복호화 의 흐름 :

   +----------------+        +--------------------+
   |                |        |                    |
   | EF = Sym(F, R) |        | ASym(PublicKey, R) |
   |                |        |                    |
   +-----+----------+        +---------+----------+
         |                             |
         |                             |
         |                             v
         |   +-------------------------+-----------------+
         |   |                                           |
         |   |             restore key (R)               |
         |   |                                           |
         |   | R <= ASym(PrivateKey, ASym(PublicKey, R)) |
         |   |                                           |
         |   +---------------------+---------------------+
         |                         |
         v                         v
     +---+-------------------------+---+
     |                                 |
     |       restore the file (F)      |
     |                                 |
     |      F <= Sym(Sym(F, R), R)     |
     |                                 |
     +---------------------------------+

또한 다음 명령을 사용할 수 있습니다.

# generate random symmetric key
openssl rand -base64 32 > /config/key.bin

# encryption
openssl rsautl -encrypt -pubin -inkey /config/public_key.pem -in /config/key.bin -out /config/key.bin.enc
openssl aes-256-cbc -a -pbkdf2 -salt -in  $file_name -out $file_name.enc -k $(cat /config/key.bin)

# now you can send this files: $file_name.enc + /config/key.bin.enc

# decryption
openssl rsautl -decrypt -inkey /config/private_key.pem -in /config/key.bin.enc -out /config/key.bin
openssl aes-256-cbc -d -a -in $file_name.enc -out $file_name -k $(cat /config/key.bin)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.