web-dev-qa-db-ja.com

OpenSSLを使用してファイルを暗号化/復号化する方法

1つのパスワードを使ってファイルを暗号化および復号化したい。

OpenSSLを使ってそれを行うことができますか?

160
aF.

これはGoogleからのあなたの質問に対するトップの答えです: http://tombuntu.com/index.php/2007/12/12/simple-file-encryption-with-openssl/

暗号化:

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

しかし、これは公開鍵基盤をまったく利用していないので、ドライバーで釘を打つのに少し似ています:-)

225
Szocske

短い答え:

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/apps/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.

その他の注意事項:

OpenSSLについて具体的に質問しましたが、この記事に基づく暗号化の目的で代わりにGPGを使用することを検討することをお勧めします。 オフサイトバックアップの暗号化におけるOpenSSLとGPG

GPGを使用して同じことを実行するには、次のコマンドを使用します。

暗号化するには:

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

復号化するには:

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

注:暗号化または復号化時にパスワードの入力を求められます。

129
moo

暗号化:

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) docsを参照してください。

31
Ken Cheung

暗号化するには:

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

復号化するには:

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

bf ===フグのCBCモード

4
fabio almeida

OpenSSL CLIはパスフレーズをキーに変換するために弱い非標準のアルゴリズムを使用し、GPGをインストールするとホームディレクトリに追加された様々なファイルとgpg-agentバックグラウンドプロセスが実行されることに注意してください。最大限の移植性と既存のツールによる制御が必要な場合は、PHPまたはPythonを使用して低レベルのAPIにアクセスし、完全なAES Keyと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関数を使ってパスフレーズを安全に鍵に変換することもできます。

3
zeroimpl

ランダムに生成された公開鍵を使用して更新します。

Encypt:

openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}

復号化:

openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}

私は http://bigthinkingapplied.com/key-based-encryption-using-openssl/でこれに関する完全なチュートリアルを持っています /

3
nneko

私はそれがファイルを暗号化しそして解読するのにopensslを使用するオンラインで見つけたオープンソースプログラムがあります。これは単一のパスワードでこれを行います。このオープンソーススクリプトの素晴らしいところは、ファイルを細断処理す​​ることによって元の暗号化されていないファイルを削除することです。しかし、危険なことは、元の暗号化されていないファイルが削除されたら、パスワードを忘れないようにする必要があることです。そうしないと、他の方法でファイルを復号化できません。

こちらのリンクはgithubにあります

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

2

OPENSSLデフォルトキー派生を使用しないでください。

現在受け入れられている答えはそれを利用しており、もはや推奨されていないし安全でもありません。

攻撃者が単純にキーをブルートフォースすることは非常に実現可能です。

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を推薦する十分な人がここにいます。いまいましい質問を読んでください。

0
Arnold Balliu