OpenSSL을 사용하여 파일을 암호화 / 암호 해독하는 방법은 무엇입니까?


205

하나의 암호를 사용하여 하나의 파일을 암호화하고 해독하고 싶습니다.

OpenSSL을 사용하여 어떻게 할 수 있습니까?


2
를 사용하여 비밀번호에서 키와 IV를 파생시켜야합니다 PKCS5_PBKDF2_HMAC. EVP_*암호화 및 암호 해독 기능을 사용해야합니다 . OpenSSL 위키에서 EVP 대칭 암호화 및 암호 해독 을 참조하십시오 . 실제로 인증 된 암호화는 기밀성과 신뢰성을 모두 제공하므로 인증 된 암호화를 사용해야 합니다. OpenSSL 위키에서 EVP 인증 암호화 및 암호 해독 을 참조하십시오 .
jww

3
OpenSSL을 원하는 이유를 질문에서 이해하지 마십시오. 아래의 의견은 GPG가 더 낫다는 것을 보여줍니다. 또한 보안 때문입니다. stackoverflow.com/a/31552829/952234 투표합니다.
Yaroslav Nikitenko

답변:


261

보안 경고 : AES-256-CBC는 인증 된 암호화를 제공하지 않으며 패딩 오라클 공격에 취약합니다 . 대신 나이 와 같은 것을 사용해야합니다 .

암호화 :

openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc

해독 :

openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new

다양한 플래그에 대한 자세한 내용


18
OP의 사용 사례에 따라 (이 글을 쓰는 시점에서) 답변이 최적이 아닐 수 있습니다. 특히 매개 변수 "-a"는 최적이 아니며 대답에 해당 사용법이 설명되어 있지 않습니다. "-a"는 일반적으로 암호화 된 출력이 ASCII / 텍스트 형식으로 전송 될 때 사용되며 이진 형식에 비해 출력 크기가 증가하는 효과가 있습니다. 원래 포스터는 출력 형식을 지정하지 않으므로 적어도 이것이 언급되어야한다고 생각합니다. 답변 : stackoverflow.com/a/31552829/952234 를 참조하십시오 .이 작업에 openssl 대신 gpg를 사용해야하는 이유에 대한 참고도 포함되어 있습니다.
moo

7
키 파생이 없으므로 위의 명령을 사용하지 마십시오. 더 읽기 : openssl 약한 키 파생
jonasl

키를 지정하거나 그 출처를 언급해야합니다. 강화 되었습니까?
Tuntable

2
최신 매뉴얼 페이지에 따르면 @jonasl은 "기본 다이제스트는 Openssl 1.1.0에서 MD5에서 SHA256으로 변경되었습니다."라고 말합니다. 출처 : github.com/openssl/openssl/blob/master/doc/man1/enc.pod
Kebman

2
@Kebman의 주석에 추가 -md sha256하여 다른 시스템에서이 파일을 사용하려는 경우 인 코드 및 디코드 명령에 추가 할 수 있습니다 . OpenSSL 버전 비 호환성 / 차이점을
다루어야합니다

162

짧은 답변:

gpg대신에 사용하고 싶을 수도 있으므로이 답변의 끝에있는 "추가 메모"openssl참조하십시오 . 그러나 다음을 사용하여 질문에 대답하십시오 .openssl

암호화하려면

openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data

해독하려면 :

openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data

참고 : 암호화 또는 암호 해독시 암호를 입력하라는 메시지가 표시됩니다.


긴 답변 :

가장 좋은 정보 출처는 openssl enc다음과 같습니다. https://www.openssl.org/docs/man1.1.1/man1/enc.html

명령 행 : openssl enc 다음 형식을 취합니다.

openssl enc -ciphername [-in filename] [-out filename] [-pass arg]
[-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] 
[-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] 
[-bufsize number] [-nopad] [-debug] [-none] [-engine id]

귀하의 질문과 관련하여 가장 유용한 매개 변수에 대한 설명 :

-e
    Encrypt the input data: this is the default.

-d    
    Decrypt the input data.

-k <password>
    Only use this if you want to pass the password as an argument. 
    Usually you can leave this out and you will be prompted for a 
    password. The password is used to derive the actual key which 
    is used to encrypt your data. Using this parameter is typically
    not considered secure because your password appears in 
    plain-text on the command line and will likely be recorded in 
    bash history.

-kfile <filename>
    Read the password from the first line of <filename> instead of
    from the command line as above.

-a
    base64 process the data. This means that if encryption is taking 
    place the data is base64 encoded after encryption. If decryption 
    is set then the input data is base64 decoded before being 
    decrypted.
    You likely DON'T need to use this. This will likely increase the
    file size for non-text data. Only use this if you need to send 
    data in the form of text format via email etc.

-salt
    To use a salt (randomly generated) when encrypting. You always
    want to use a salt while encrypting. This parameter is actually
    redundant because a salt is used whether you use this or not 
    which is why it was not used in the "Short Answer" above!

-K key    
    The actual key to use: this must be represented as a string
    comprised only of hex digits. If only the key is specified, the
    IV must additionally be specified using the -iv option. When 
    both a key and a password are specified, the key given with the
    -K option will be used and the IV generated from the password 
    will be taken. It probably does not make much sense to specify 
    both key and password.

-iv IV
    The actual IV to use: this must be represented as a string 
    comprised only of hex digits. When only the key is specified 
    using the -K option, the IV must explicitly be defined. When a
    password is being specified using one of the other options, the 
    IV is generated from this password.

-md digest
    Use the specified digest to create the key from the passphrase.
    The default algorithm as of this writing is sha-256. But this 
    has changed over time. It was md5 in the past. So you might want
    to specify this parameter every time to alleviate problems when
    moving your encrypted data from one system to another or when
    updating openssl to a newer version.

추가 사항 :

OpenSSL에 대해 구체적으로 요청했지만 오프 사이트 백업을 암호화하기 위해이 기사 OpenSSL vs GPG를 기반으로 암호화 목적 대신 GPG를 사용하는 것이 좋습니다.

GPG를 사용하여 동일한 작업을 수행하려면 다음 명령을 사용하십시오.

암호화하려면

gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data

해독하려면 :

gpg --output un_encrypted.data --decrypt encrypted.data

참고 : 암호화 또는 암호 해독시 암호를 입력하라는 메시지가 표시됩니다.


8
OpenSSL보다 GPG를 선호하는 것에 대한 좋은 의견. OpenSSL이 키에 약한 암호 파생 해시를 사용한다는 것은 놀라운 일입니다!
Mark

2
-md 옵션을 지정하지 않고 이전 openssl에서 암호화 된 파일과의 호환성을 위해 "-md md5"옵션을 사용해야합니다. 그렇지 않으면 최신 시스템에서 파일이 해독되지 않습니다. github.com/libressl-portable/ 휴대용 / 문제 / 378
Sam Liddicott

1
openssl 버전간에 기본값이 변경됩니다. 1.0.x는 -md 옵션에 기본값 md5를 사용합니다. 버전 1.1.x는 sha256을 사용합니다. 해독하고 ": 디지털 봉투 루틴 : EVP_DecryptFinal_ex : bad decrypt"오류가 발생하는 경우 "-md md5"또는 "-md sha256"을 지정하십시오.
txyoji

1
"암호화 또는 암호 해독시 암호를 입력하라는 메시지가 나타납니다." gpg암호를 묻지 않고 파일을 해독 할 수 있습니다. 암호가 일정 기간 동안 저장되어있는 것처럼 보이지만 원하지 않습니다.
user76284

1
@moo 또한 에이전트가 실행 중이더라도 --no-symkey-cachegpg와 함께 gpg를 사용할 때 옵션이 캐싱을 비활성화 하는 것으로 보입니다 --symmetric.
user76284

32

암호화 :

openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey

해독 :

openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey

자세한 내용은 openssl(1)문서를 참조하십시오 .


11
일반 텍스트 암호를 사용하여 교체 -k symmetrickey-pass stdin-pass 'pass:PASSWORD'
Zenexer

3
키 파생이 없으므로 위의 명령을 사용하지 마십시오. 더 읽기 : openssl 약한 키 파생
jonasl

4
@jonasl의 의견과 관련하여 -k symmetrickey오해의 소지가 있습니다. 이 -k옵션은 OpenSSL이 대칭 키를 파생시키는 비밀번호를 지정하는 데 사용됩니다. 대칭 키를 지정하려면 -K옵션을 사용해야합니다 .
user1071847

13

OPENSSL DEFAULT KEY DERIVATION을 사용하지 마십시오.

현재 허용되는 답변은이를 사용하며 더 이상 권장되지 않으며 안전하지 않습니다.

침입자가 키를 무차별 적으로 실행하는 것이 매우 가능합니다.

https://www.ietf.org/rfc/rfc2898.txt

PBKDF1은 키를 파생시키기 위해 MD2 [6], MD5 [19] 또는 SHA-1 [18] 인 해시 함수를 적용합니다. 파생 된 키의 길이는 해시 함수 출력의 길이에 의해 제한되는데, MD2 및 MD5의 경우 16 옥텟이고 SHA-1의 경우 20 옥텟입니다. PBKDF1은 PKCS # 5 v1.5의 키 파생 프로세스와 호환됩니다. PBKDF1은 기존 응용 프로그램과의 호환성을 위해서만 권장됩니다. PBKDF1은 생성하는 키가 일부 응용 프로그램에는 충분하지 않을 수 있기 때문입니다.

PBKDF2는 의사 난수 함수 (예 : 부록 B.1 참조)를 적용하여 키를 파생시킵니다. 파생 된 키의 길이는 기본적으로 제한이 없습니다. 그러나 파생 된 키의 최대 유효 검색 공간은 기본 의사 난수 함수의 구조에 따라 제한 될 수 있습니다. 자세한 내용은 부록 B.1을 참조하십시오. PBKDF2는 새로운 응용 프로그램에 권장됩니다.

이 작업을 수행:

openssl enc -aes-256-cbc -pbkdf2 -iter 20000 -in hello -out hello.enc -k meow

openssl enc -d -aes-256-cbc -pbkdf2 -iter 20000 -in hello.enc -out hello.out

참고 : 복호화의 반복은 암호화의 반복과 동일해야합니다.

반복 횟수는 최소 10000이어야합니다. 반복 횟수에 대한 정답은 다음과 같습니다. https://security.stackexchange.com/a/3993

또한 ... GPG를 추천하는 사람들이 충분합니다. 빌어 먹을 질문을 읽으십시오.


4

암호화하려면

$ openssl bf < arquivo.txt > arquivo.txt.bf

해독하려면 :

$ openssl bf -d < arquivo.txt.bf > arquivo.txt

bf === CBC 모드에서 복어



3

OpenSSL CLI는 약한 비표준 알고리즘을 사용하여 암호를 키로 변환하고 GPG를 설치하면 홈 디렉토리에 추가 된 다양한 파일과 gpg-agent 백그라운드 프로세스가 실행됩니다. 기존 도구로 최대한의 이식성과 제어를 원한다면 PHP 또는 Python을 사용하여 하위 수준 API에 액세스하고 전체 AES 키 및 IV를 직접 전달할 수 있습니다.

Bash를 통한 PHP 호출 예 :

IV='c2FtcGxlLWFlcy1pdjEyMw=='
KEY='Twsn8eh2w2HbVCF5zKArlY+Mv5ZwVyaGlk5QkeoSlmc='
INPUT=123456789023456

ENCRYPTED=$(php -r "print(openssl_encrypt('$INPUT','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$ENCRYPTED='$ENCRYPTED
DECRYPTED=$(php -r "print(openssl_decrypt('$ENCRYPTED','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$DECRYPTED='$DECRYPTED

출력 :

$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456

PHP의 openssl_pbkdf2기능을 사용 하여 암호를 키로 안전하게 변환 할 수도 있습니다 .


Openssl CLI는 암호 해싱에 PBKDF2를 사용해야한다는 것을 사용자에게 구현하고 경고합니다. 그러나 기본 반복 횟수는 매우 적으며 훨씬 더 커야합니다.
앤서니

2

온라인에서 찾은 오픈 소스 프로그램이 있는데 openssl을 사용하여 파일을 암호화하고 해독합니다. 단일 비밀번호로이를 수행합니다. 이 오픈 소스 스크립트의 가장 큰 장점은 파일을 파쇄하여 암호화되지 않은 원본 파일을 삭제한다는 것입니다. 그러나 위험한 것은 원래 암호화되지 않은 파일이 사라지면 암호를 기억해야합니다. 그렇지 않으면 파일을 해독하는 다른 방법이 아닙니다.

여기 링크가 github에 있습니다.

https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py


파일 암호화에 openssl을 사용할 때 상황이 변경되었으며, 더 많은 옵션이 있으므로 암호화 된 파일을 성공적으로 해독 할 수 있도록 기억해야합니다. 이에 대한 한 가지 해결책은 "keepout"입니다. antofthy.gitlab.io/software/#keepout
anthony

2

다른 답변에서 언급했듯이 이전 버전의 openssl은 약한 키 파생 함수를 사용하여 암호에서 AES 암호화 키를 파생했습니다. 그러나 openssl v1.1.1은보다 강력한 키 파생 기능을 지원합니다. 여기서 키는 pbkdf2무작위로 생성 된 솔트를 사용하여 비밀번호에서 파생되며 sha256 해싱의 여러 반복 (기본적으로 10,000)입니다.

파일을 암호화하려면

 openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename

파일을 해독하려면

  openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename

이러한 옵션이 계속 변경됨에 따라 각 openssl 암호화 파일을 작성할 때 사용 된 옵션에 대한 기록도 유지해야합니다. 특히 반복 횟수는 시간이 지남에 따라 증가해야합니다! 하나의 솔루션에 대해서는 openssl enc ... "keepout" antofthy.gitlab.io/software/#keepout 주위의 비교적 간단한 래퍼로 볼 수 있습니다. 시간이 지남에 따라 더 많은 openssl을 포함하도록 확장 할 수 있습니다.
앤서니

@anthony는 유용한 프로젝트처럼 보입니다. 또한 참조 github.com/meixler/web-browser-based-file-encryption-decryption
mti2935

0

mti2935에 대한 추가 의견

반복이 높을수록 무차별 대항에 대한 보호 기능이 향상되고 성능 / 자원을 현명하게 감당할 수 있도록 높은 반복을 사용해야합니다.

내 오래된 Intel i3-7100에서 다소 큰 파일 1.5GB를 암호화합니다.

 time openssl enc -aes256 -e -pbkdf2 -iter 10000 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
 Seconds: 2,564s

 time openssl enc -aes256 -e -pbkdf2 -iter 262144 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
 Seconds:  2,775s

실제로 차이는 없지만 메모리 사용량을 확인하지는 않았습니다 (?)

오늘날의 GPU와 더 빠른 내일을 통해 수십억 개의 무차별 강제 반복이 가능한 것으로 보입니다.

12 년 전NVIDIA GeForce 8800 Ultra 200.000 백만 / 초 이상의 반복을 반복 할 수있었습니다 (MD5 해싱).

출처 : Ainane-Barrett-Johnson-Vivar-OpenSSL.pdf

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