我通过 AES 加密/解密示例进行了以下观察,这对我来说非常违反直觉。
我尝试在 CBC 模式下使用 AES 加密和解密一个简单的有效负载。我的理解是,根据这个答案,初始化向量不必是秘密的: https: //security.stackexchange.com/a/17046。在我看到的大多数示例中,初始化向量是加密有效负载的非随机部分。
但通过更改初始化向量,我能够在加密期间更改消息。
例如,请参阅我从/sf/answers/1535015331/复制并改编的这个 python 示例。我设置了硬编码的ivforencrypt并稍微调整了ivfor decrypt。通过此更改,我可以将消息从"hello world"更改为"hello!world"。
import base64
import hashlib
from Crypto.Cipher import AES
class AESCipher(object):
def __init__(self, key):
self.bs = AES.block_size
self.key = hashlib.sha256(key.encode()).digest()
def encrypt(self, raw):
raw = self._pad(raw)
#iv = Random.new().read(AES.block_size)
# | here is the difference to the iv from decrypt
iv = b'\xe2\xe0l3H\xc42*N\xb0\x152\x98\x9cBh'
cipher = AES.new(self.key, AES.MODE_CBC, iv)
code = cipher.encrypt((raw.encode())) …Run Code Online (Sandbox Code Playgroud)