2017-04-06 91 views
0

我遇到了一个奇怪的问题。 我用字母'A'填充了一个文本文件,并将其长度设置为4096个字节。 然后,使用OpenSSL加密它在Linux:在CBC模式下使用openssl和dmsetup进行AES加密的垃圾文件

KEY="2D242B65C517B72F8D1DAA8278CA5A2ED5D8A95BCF82BFD3778212218726335F" 
openssl enc -nosalt -iv 0 -K $KEY -aes-256-cbc -in $PLAINIMAGENAME -out $CRYPTIMAGENAME 

(无盐,无IV)

然后,试图建立与DM-隐窝一个设备映射器回送设备:

 
losetup /dev/loop0 $CRYPTIMAGENAME 
sudo dmsetup create cryptotest --table "0 4096 crypt aes-cbc-null $KEY 0 /dev/loop0 0" 

当我尝试从/ dev/mapper/cryptotest读取时,得到我的A,但每512字节(块大小?)有16个字节的垃圾。这怎么可能?

当我使用ECB模式(每块都以相同的方式加密)时,一切正常。顺便说一下,我不想使用LUKS进行环回加密,我需要一个无标题的AES流,它可以由openssl或aespipe创建。

+1

这是填充:https://en.wikipedia.org/wiki/Padding_(cryptography) –

+0

注意,AES的块大小是16个字节。 – zaph

+0

我相信dm-crypt使用不带填充的CBC模式。这是因为磁盘扇区是固定大小,并且总是块大小的倍数。 ECB和CBC模式都可以解密块,我感到很奇怪。 – jww

回答

2

我找到了解决该问题:

的设备映射器需要开始一个新的CBC每个扇区(512个字节== 32个AES块),以便能够有随机存取的扇区,而不必在此之前解密所有内容。因此,我必须连接长度为512的aes-128-cbc加密流。 当然,零的IV不是很好。我现在使用aes-128-cbc-essiv:sha256。 ESSIV由加密密钥和扇区号的散列(sha256)计算,所以没有扇区具有相同的加密数据。

进一步的信息可以在这里找到:http://www.penzin.net/dmcrypt/

+1

对于加密磁盘扇区,请查看[磁盘加密理论](https://en.wikipedia.org/wiki/Disk_encryption_theory#XEX-based_tweaked-codebook_mode_with_ciphertext_stealing_.28XTS.29)。 – zaph

相关问题