如何使用aes-cbc解密随机加密数据块?
答案 0 :(得分:1)
第一条信息:
AES的块大小为128位。因此,当您说“AES-128”时,假设密钥大小为128位,“AES-256”假设密钥大小为256位。
CBC模式需要iv。 iv用于第一个块,每个块以类似的方式使用前一个块的值。请参阅Cipher Block Chaining (CBC)。
解密必须在块边界上完成。第一个块将使用iv,后续块将使用先前加密块的值,主要用于iv。因此,解密可以从加密数据的开头之外开始。
我的一个假设是gpg和openssl将iv置于加密数据之前,这是常规程序,但这是我的猜测,但可能更复杂(我懒得查看)。这可以解释为什么第一个块的解密会起作用,而不是来自其他起始位置。
有关更多信息,请参阅可用文档。
Cryptomathic提供了一个很好的在线AES calculator。
答案 1 :(得分:1)
在zaph的回答中,我能够在python中这样做:
from os import urandom
from Crypto.Cipher import AES
import hashlib
IV = urandom(16)
aes = AES.new(hashlib.sha256(b'123').digest(), AES.MODE_CBC, IV)
T='1234567890'*160
C=aes.encrypt(T)
# Now if we make a new aes instance with IV we will be able to decrypt first block:
aes = AES.new(hashlib.sha256(b'123').digest(), AES.MODE_CBC, IV)
aes.decrypt(q[:16]) # It returns b'1234567890123456'
# But if we need to decrypt block 4 we need to instanciate aes with contents of block 3 as iv parameter:
aes = AES.new(hashlib.sha256(b'123').digest(), AES.MODE_CBC, q[48:64])
aes.decrypt(q[64:80]) # It returns b'5678901234567890'
因此,如果你想使用aes-cbc从块n解密一些加密文本(例如,字节n×16到m×16),那么你需要解释一些加密文本,你需要来自块n-1的数据(字节(n-1)×16到(n×16)-1)作为IV以在块n上开始解密。这样,即使您没有访问除第一个块(前16个字节)之外的整个数据,您也可以解密任何数据块。