openssl
使用 Camellia 256 位密码加密文件时,您可以明确指定块模式(例如camellia-256-cfb
等camellia-256-ofb
)。但是,如果您只使用-camellia256
不带块模式的选项,那么假定的隐式模式是什么?
我尝试通过使用固定的虚拟 iv 和密钥以所有不同的模式加密相同的文件来弄清楚,如下所示:
#!/usr/bin/env bash
# create 1MB file with random data
openssl rand 1048576 -out random.bin
iv='11111111111111111111111111111111'
key='2222222222222222222222222222222222222222222222222222222222222222'
ciphers=(camellia256 camellia-256-cfb camellia-256-cfb1 camellia-256-cfb8 camellia-256-ecb camellia-256-ofb)
for c in ${ciphers[*]}; do
# encrypt
openssl enc -$c -iv $iv -K $key -in random.bin -out random-$c.bin
# show hash of encrypted result
openssl dgst -sha256 random-$c.bin
done
输出是:
SHA256(random-camellia256.bin)= 5625222f4bc4dd0e690ebfd24ade853f22d5155584756d9da41b6d8657d01a75
SHA256(random-camellia-256-cfb.bin)= 2b57e9cd8566af072a6162b21dc4e69337d2a9a23443fc7c25c0c1eba7f2d6eb
SHA256(random-camellia-256-cfb1.bin)= ae96dc3bdea49ec1d5c706db7f4e097f8e4e641abf2bb108eb57aa90d00eb84e
SHA256(random-camellia-256-cfb8.bin)= 7266631c9616fbfc00039dd868ba74af09d8829af11b45d83d46cb12925dceb2
SHA256(random-camellia-256-ecb.bin)= f91f4d164d40e7abb2b6a11e051d12ff82d256e4f52437d9f8997670cdb337b8
SHA256(random-camellia-256-ofb.bin)= 79a29d5790a68498ca90acb8b19fcb4e2a0066527a9de2419b9633d9f3cbaa6e
当然,由于随机输入,每次运行脚本时都会有所不同。
或者,如果我使用填充零(0x00 字节)而不是随机数据的文件,如下所示:
dd bs=1048576 count=1 if=/dev/zero of=zeroes.bin
输出是:
SHA256(zeroes-camellia256.bin)= 22116d07d0c5b43e736f9990ad3f48c7710fe78ba1d6bb993dfa5a6d3a6fb133
SHA256(zeroes-camellia-256-cfb.bin)= cc75fc3257959bcaee12de3da7ef547d2f548a936d9068abde103c158d9540a8
SHA256(zeroes-camellia-256-cfb1.bin)= 912dc60b10bfad7d33fed18c1419f83437fcf84708a9336f3bbcf0a6164cd70d
SHA256(zeroes-camellia-256-cfb8.bin)= 70d340b32f58c9f2169a91c20698893046b76cd560e7a0fe2a1001591990fb8e
SHA256(zeroes-camellia-256-ecb.bin)= b9fdd441312bf9992fdca2fbbdbc165a738359312de53b0ddc71e383880cd43f
SHA256(zeroes-camellia-256-ofb.bin)= cc75fc3257959bcaee12de3da7ef547d2f548a936d9068abde103c158d9540a8
注意这里的cfb
和ofb
输出是一样的。但这可能是由于这些块模式如何根据输入数据定义密码流。
无论如何,没有明确定义块模式的模式再次与所有其他模式不同。
-camellia256
所以我的问题是:当我指定为密码算法时,openssl 使用什么块模式?
顺便说一句,当我使用 AES 而不是 Camellia 进行测试时,它似乎aes256
与aes-256-cbc
.
OpenSSL 通常默认为 CBC 模式和与 PKCS#7 兼容的填充,因此 Camellia 也会发生这种情况也就不足为奇了。这因加密库而异,顺便说一下,没有任何模式是所有加密库的默认模式(Java 标准提供程序默认为 ECB)。
通常,您始终可以从 ECB 模式创建一个模式,因为单个 ECB 块加密只是块密码的执行。我不会深入解释如何做到这一点,但通常前两个块很容易做到。
但是,正如您所指出的,所有这些都不是必需的,因为您也可以直接指定 CBC 模式然后进行比较。