対称キーを使用してファイルを暗号化するとき、最も一般的なユーティリティ(gpg、mcryptなど)は、復号化中にキーの整合性を検証するために使用できる情報を暗号化されたメッセージに保存します。たとえば、復号化中に間違ったキーを入力すると、gpg は次を返します。
gpg:復号化失敗:無効なキー
ランダムな文字列を含むファイルを暗号化するとします。その後、標準ユーティリティで使用される主要な整合性チェックにより、脆弱性が追加されます。
キー/メッセージの整合性を確認するために情報や冗長性を保存しない一般的なユーティリティはあります(したがって、確認のために暗号化されたファイルを「復号化する」)どのキー提供)?
答え1
私の交換でその他の回答、他のものを提案したいと思います。何か美しいです... DM-crypt。
一般的なdm-crypt(LUKSなし)はキーに関する情報を保存しません。代わりに、cryptsetup
通常のデバイスを開いて使用するためにパスワードを使用することをお勧めします。たとえば、見てみましょう。
[root:tmp]# fallocate -l 16M cryptfile
[root:tmp]# cryptsetup --key-file - open --type plain cryptfile cfile-open <<<"pa55w0rd"
注:cryptfile
サイズは512バイト以上でなければなりません。最小セクタサイズの施行が考えられますcryptsetup
。
この時点では、すべてのランダムなデータを/dev/mapper/cfile-open
。 Obscurityはセキュリティを追加し、ユーザーが書き込むデータの量を正確に記録します。 (これはデフォルトのチャンクがすでに半ランダムである場合にのみ実際に機能します。つまり、ファイルを完全に埋めようとしない場合は、代わりににまたはを使用してopenssl rand
作成する必要があります。)... Somewhereを使用してデバイスから書き込みを開始することもできます。途中で。dd if=/dev/urandom
fallocate
dd
それでは、もう少し簡単なことをしましょう。
[root:tmp]# cryptsetup status cfile-open
/dev/mapper/cfile-open is active.
type: PLAIN
cipher: aes-cbc-essiv:sha256
keysize: 256 bits
device: /dev/loop0
loop: /tmp/cryptfile
offset: 0 sectors
size: 32768 sectors
mode: read/write
[root:tmp]# b $((32768*512))
B KiB MiB GiB TiB PiB EiB
16777216 16384.0 16.00 .01 0 0 0
[root:tmp]# ll cryptfile
-rw-r--r--. 1 root root 16777216 Feb 21 00:28 cryptfile
[root:tmp]# openssl rand -out /dev/mapper/cfile-open $((32768*512))
[root:tmp]# hexdump -n 16 -C /dev/mapper/cfile-open
00000000 00 1d 2d 11 ac 38 c4 d3 cc 81 4f 32 de 64 01 ca |..-..8....O2.d..|
00000010
[root:tmp]# cryptsetup close cfile-open
この時点で、暗号化されたファイルを16MiBのランダムデータで埋めました。間違ったパスワードで再度開くと、何が起こるかを確認してください。正しいパスワードで再度開くと、元のデータがそのまま残っていることがわかります。
[root:tmp]# cryptsetup --key-file - open --type plain cryptfile cfile-open <<<"pass"
[root:tmp]# hexdump -n 16 -C /dev/mapper/cfile-open
00000000 89 97 91 26 b5 46 87 0c 67 87 d8 4a cf 78 e6 d8 |...&.F..g..J.x..|
00000010
[root:tmp]# cryptsetup close cfile-open
[root:tmp]# cryptsetup --key-file - open --type plain cryptfile cfile-open <<<"pa55w0rd"
[root:tmp]# hexdump -n 16 -C /dev/mapper/cfile-open
00000000 00 1d 2d 11 ac 38 c4 d3 cc 81 4f 32 de 64 01 ca |..-..8....O2.d..|
00000010
[root:tmp]#
楽しんでください。
答え2
GnuPGはあなたが望むことをすることはできません。ただし、OpenSSLを使用すると可能です。 cfbやofbなどのストリーミングモードでは、これらのパスワード(好ましくはAES)のいずれかを使用する必要があります。 (望むより:http://en.wikipedia.org/wiki/Block_cipher_mode_of_Operation)
通常、opensslを使用してデータを暗号化するときは、次のようにcbc(base64エンコード()を含めるか除く)を使用します-a
。もちろん、パスワードと入力データを指定する他の方法もあります(参考資料を参照man openssl
)。
[rsaw:~]$ openssl aes-256-cbc -e -a -pass pass:pa55w0rd <<<inputdata
U2FsdGVkX180a9K5gBgip7/lgdCGCLLlRflAjK8+YwY=
[rsaw:~]$ openssl aes-256-cbc -e -a -pass pass:pa55w0rd <<<inputdata
U2FsdGVkX1+4uSv4uCNj2J4g7441XDioDoAb6JNn2RU=
[rsaw:~]$ openssl aes-256-cbc -e -a -pass pass:pa55w0rd <<<inputdata |
> openssl aes-256-cbc -d -a -pass pass:pa55w0rd
inputdata
毎回異なる結果が出ているという事実は、あなたのパスワードがソルト処理されていることを示し、これは一般的に良いです。さて、間違ったキーを使って何が起こるのか見てみましょう。
[rsaw:~]$ openssl aes-256-cbc -e -a -pass pass:pa55w0rd <<<inputdata |
> openssl aes-256-cbc -d -a -pass pass:pa55w0r
bad decrypt
139867807664032:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:596:
簡単に言えば、このモード(cbc)はファイルを暗号化するために広く使用されていますが、明らかにあなたが要求した要件を満たしていません。別のことを試してみましょう。
[rsaw:~]$ openssl aes-256-cfb1 -e -a -pass pass:pa55w0rd <<<inputdata
U2FsdGVkX1+p64nx+/K6yCHdHw+Nmn6fSOg=
[rsaw:~]$ openssl aes-256-cfb1 -e -a -pass pass:pa55w0rd <<<inputdata |
> openssl aes-256-cfb1 -d -a -pass pass:pa55w0rd
inputdata
[rsaw:~]$ openssl aes-256-cfb1 -e -a -pass pass:pa55w0rd <<<inputdata |
> openssl aes-256-cfb1 -d -a -pass pass:pa55w0r
'G�疏s�v
上記がお客様の要件を満たしていても保証することはできません。私は暗号の専門家ではありません。暗号化は大変です。複雑です。私〜するそう言って要件を満たしaes*cfb*
たらaes*ofb
…スキップする必要がありますaes*ecb
。
2つの興味深い情報を提供します。
私は通常、ソルトされていないキーを使用することをお勧めしませんが、実行中の操作(任意のデータ暗号化)の場合...データ定義構造の先頭にさらに明確性を追加するため、ソルトをスキップできます。たとえば、
[rsaw:~]$ openssl aes-256-cfb1 -e -a -pass pass:pa55w0rd <<<inputdata U2FsdGVkX18aMT3eK4IH+XWGhp4dOSG9UJQ= [rsaw:~]$ openssl aes-256-cfb1 -e -a -pass pass:pa55w0rd <<<inputdata U2FsdGVkX18uIlFFMbsZib11UgjuITY9rNw= [rsaw:~]$ openssl aes-256-cfb1 -e -a -pass pass:pa55w0rd <<<inputdata U2FsdGVkX1+G9lAIj7RjafT9YNfO9RQXDjU= [rsaw:~]$ openssl aes-256-cfb1 -e -nosalt -a -pass pass:pa55w0rd <<<inputdata X2zi09uo6ale8A==
暗号化されたデータを含むデータを保存するときの整合性は、常に最大の関心事の1つです。データが破損している場合は、ファイル全体を捨てることができるようにしたいと思います。 opensslなどのブロック暗号
aes*cbc
(またはAFAIKはこれにGnuPGを使用)を使用すると、小さなビット反転が捕捉され、復号化が失敗します。一方、正しく実行している場合は、ストリーミングモードを使用してできるだけ多くのデータを回復できます。つまり、ストリームに存在する部分への損傷を維持します。確認する:[rsaw:tmp]$ openssl aes-256-cfb1 -e -a -pass pass:pa55w0rd </etc/services >services.asc [rsaw:tmp]$ wc -l services.asc 13965 services.asc [rsaw:tmp]$ sed '6000q;d' services.asc e6AAnnXAF74c8p52q7+klGC+JHfK91QOx+oFonAzKFoJt0DSNg2WQkdBaxv4YLst [rsaw:tmp]$ sed -i '6000s/^e/f/' services.asc [rsaw:tmp]$ sed '6000q;d' services.asc f6AAnnXAF74c8p52q7+klGC+JHfK91QOx+oFonAzKFoJt0DSNg2WQkdBaxv4YLst [rsaw:tmp]$ openssl aes-256-cfb1 -d -a -pass pass:pa55w0rd <services.asc | diff - /etc/services 5029c5029,5030 < veronica 2770/tcp %���#��*����@jeronica 2770/udp # Veronica --- > veronica 2770/tcp # Veronica > veronica 2770/udp # Veronica
楽しんでください。
gpg
PS:openssl
、、またはdm-crypt以外のものをあえて使用しないでください。大きいもの3つをつけます。他の人はいません。
答え3
このツールはキーを確認するために何も保存しません。
答え4
@udkLpqc:これについてコメントすることはできません。ツールを使用するかどうかはあなた次第ですが、あなたが書いたものは、ある点で私が見るものとは異なります。 Ubuntuから直接コンパイルしました。
$echo -e "uvwxyz\n\n\n\n\n\n\n\n\n\n" | wc -l
11
$echo -e "uvwxyz\n\n\n\n\n\n\n\n\n\n" | ./aes -p "t" | ./aes -d -p "t" | wc -l
11
これは私に同じ数の行のように見えます(ファイルを使用して同じ結果を得ました)。このツールは古く、ソースによると、PKCS7ではなくPKCS5をサポートしていると言われています。パスワードをエコーする理由を文書化し、strnlenの代わりにstrlenを使用します。さて、これはコンテキストで見なければならず、ツールはユーザーから直接入力を期待し、ファイル名とパスワードにのみstrlenを使用します。ファイル名とパスワードが信頼できないソースからの自動化された環境で使用する予定であることに同意します。おそらく動作しません。