有什麼好的文件格式替代 PGP 來加密靜態數據?
我想創建一個加密文件:
- 可以在知道密鑰的情況下在各種平台(主要是 Windows、OS X 和 Linux)上解密。
- 可以使用現有工具解密(也許編寫一個 shell 腳本將常用工具連接在一起)。
- 採用如此簡單的文件格式,因此假設您有一個包含 AES 和 HMAC-SHA256 等原語的標準庫,而無需花費數天或數週時間嘗試理解文件格式,那麼從頭開始編寫自己的解密函式會相對容易。
到目前為止,我提出了三種選擇:
- PGP - 這聽起來很簡單,但它的文件格式非常複雜,需要使用像 BouncyCastle 這樣的庫。我寧願有一些更簡單的東西,不需要依賴。
- OpenSSL - 它有一個非常簡單的文件格式。在了解了它的key 和 IV 推導函式之後,我能夠用幾行程式碼編寫自己的 reader 和 writer 。但是,該格式的標準中沒有 MAC。
- KeyCzar - 加密的文件格式確實有一個 MAC,但加密和解密文件的工具並不像 PGP 或 OpenSSL 那樣流行。
鑑於這些選項,如果我能以一種直覺的方式將 MAC 合併到 OpenSSL 中,那麼它聽起來非常引人注目。我可以
openssl dgst
在加密文件上執行,然後將其連接到它的末尾,但這有點棘手,我擔心在自定義實現中可能很容易弄亂文件的 Encrypt-then-MAC 特性。我錯過了這個問題的簡單答案嗎?
提前致謝。
我越想這個,我就越覺得最好不要這樣做。
我想不出一種足夠簡單的文件格式——它們至少都有一些難以通過 shell 腳本等複制的結構。此外,文件格式的安全考慮很容易出現,尤其是在考慮密碼的情況下。
從現有的實用程序中,我建議快速查看scrypt。它有一個非常簡單的磁碟文件格式和對細節的細緻關注。不過,它不使用實際密鑰進行加密,只使用密碼。問題在於 scrypt 密鑰派生函式在內部使用 Salsa20,並且重新實現並不那麼簡單。
但是,無論如何,我認為我會創建類似於您想要的東西,但沒有任何密碼功能。
genkey.sh
:#!/usr/bin/sh openssl rand -out $1 64
enc.sh
:#!/bin/sh KEY=$1 FILE=$2 OUTPUT=$3 HMAC_KEY=`hexdump -v -e '/1 "%02x"' -n 32 -s 0 $KEY` AES256_KEY=`hexdump -v -e '/1 "%02x"' -n 32 -s 32 $KEY` openssl rand -out $OUTPUT 16 AES256_IV=`hexdump -v -e '/1 "%02x"' -n 16 $OUTPUT` openssl enc -in $FILE -K "$AES256_KEY" -iv "$AES256_IV" -aes-256-cbc >> $OUTPUT openssl dgst -hmac $HMAC_KEY -binary -sha256 $OUTPUT >> $OUTPUT
dec.sh
:#!/bin/sh KEY=$1 FILE=$2 OUTPUT=$3 HMAC_KEY=`hexdump -v -e '/1 "%02x"' -n 32 -s 0 $KEY` AES256_KEY=`hexdump -v -e '/1 "%02x"' -n 32 -s 32 $KEY` AES256_IV=`hexdump -v -e '/1 "%02x"' -n 16 -s 0 $FILE` SIZE=`stat -c"%s" $FILE` HMAC_BLOCKS=$(($SIZE/16 - 2)) AES_BLOCKS=$(($SIZE/16 - 3)) HMAC_FILE=`dd if=$FILE bs=16 skip=$HMAC_BLOCKS | hexdump -v -e '/1 "%02x"'` HMAC_CALCULATED=`dd if=$FILE bs=16 count=$HMAC_BLOCKS | openssl dgst -hmac $HMAC_KEY -sha256 -binary | hexdump -v -e '/1 "%02x"'` if [ "x$HMAC_FILE" != "x$HMAC_CALCULATED" ]; then echo "fuuuuu" else dd if=$FILE bs=16 skip=1 count=$AES_BLOCKS status=noxfer | openssl enc -d -K "$AES256_KEY" -iv "$AES256_IV" -aes-256-cbc -out $OUTPUT fi
密鑰格式為:
- 32 字節 AES-256 密鑰
- 32 字節 HMAC-SHA256 密鑰
加密文件格式為:
- 16字節AES IV(每次隨機生成)
- x*16 字節 AES-256-CBC 加密數據,帶有 PKCS#5 填充
- 32 字節的 HMAC-SHA256 覆蓋整個前面的文件(包括 IV 和填充和加密的數據)
首先驗證 HMAC,因此在 MAC 錯誤的情況下不會解密數據。IV 包含在 HMAC 中,因此也沒有任何問題。為了獲得小於 2 -32的重複 IV 機率,相同的密鑰最多可以使用 2 48,這應該足夠了。單個文件的長度可能受到 HMAC 的限制,最大為 2 60 - 1 個字節,這也應該足夠了。不應存在允許偽造、恢復密鑰或恢復 2 128複雜度下的明文的攻擊。整個生成的文件應該與隨機文件沒有區別,除了文件大小始終是 16 的倍數。但不保證安全性,同行評審是必須的。
這些腳本不進行參數驗證,通常只是為了展示它們是如何工作的,而不是為了安全或實際使用。特別是,實際的加密密鑰顯示在命令行參數中,因此任何使用者都可以看到
ps
- 所以這些真的不應該用於任何嚴重的事情。