5

我需要玩一些 AES 片段。

我有一些密文c和一个密钥k。密文已使用 AES-CBC 加密,并在前面加上 IV。不存在填充,纯文本的长度是 16 的倍数。

所以我这样做:

aes = OpenSSL::Cipher::Cipher.new("AES-128-CCB")
aes.decrypt
aes.key = k
aes.iv = c[0..15]
aes.update(c[16..63]) + aes.final

它工作得很好。

现在我需要手动执行 CBC 模式,所以我需要对单个块进行“普通”AES 解密。

我正在尝试这个:

aes = OpenSSL::Cipher::Cipher.new("AES-128-ECB")
aes.decrypt
aes.key = k
aes.iv = c[0..15]
aes.update(c[16..31]) + aes.final

它失败了

in `final': bad decrypt (OpenSSL::Cipher::CipherError)

我该怎么做?

4

1 回答 1

9

我假设您收到final错误,因为它默认使用填充。

decrypter.padding = 0

同样要使用 ECB 模式手动执行 CBC 模式,设置 IV 将无济于事,您需要将解密的块与 IV (或前一个密文块,如果您最终解密多个块)进行异或。

于 2013-04-18T15:14:04.753 回答