gpt4 book ai didi

python - PyCrypto - 初始化向量如何工作?

转载 作者:太空狗 更新时间:2023-10-29 17:42:27 26 4
gpt4 key购买 nike

我试图了解 PyCrypto 如何在项目中使用,但我没有完全理解初始化向量 (IV) 的重要性。我发现在解码字符串时我可以使用错误的 IV,而且除了前 16 个字节( block 大小)之外,我似乎仍然能收到消息。只是用错了还是不理解?

这里有一个示例代码来演示:

import Crypto
import Crypto.Random
from Crypto.Cipher import AES

def pad_data(data):
if len(data) % 16 == 0:
return data
databytes = bytearray(data)
padding_required = 15 - (len(databytes) % 16)
databytes.extend(b'\x80')
databytes.extend(b'\x00' * padding_required)
return bytes(databytes)

def unpad_data(data):
if not data:
return data

data = data.rstrip(b'\x00')
if data[-1] == 128: # b'\x80'[0]:
return data[:-1]
else:
return data


def generate_aes_key():
rnd = Crypto.Random.OSRNG.posix.new().read(AES.block_size)
return rnd

def encrypt(key, iv, data):
aes = AES.new(key, AES.MODE_CBC, iv)
data = pad_data(data)
return aes.encrypt(data)

def decrypt(key, iv, data):
aes = AES.new(key, AES.MODE_CBC, iv)
data = aes.decrypt(data)
return unpad_data(data)

def test_crypto ():
key = generate_aes_key()
iv = generate_aes_key() # get some random value for IV
msg = b"This is some super secret message. Please don't tell anyone about it or I'll have to shoot you."
code = encrypt(key, iv, msg)

iv = generate_aes_key() # change the IV to something random

decoded = decrypt(key, iv, code)

print(decoded)

if __name__ == '__main__':
test_crypto()

我正在使用 Python 3.3。

输出会因执行而异,但我得到类似这样的信息:b"1^,Kp}Vl\x85\x8426M\xd2b\x1aer secret message。请不要告诉任何人,否则我会必须向你开枪。”

最佳答案

您看到的行为特定于 CBC 模式。使用 CBC,解密可以通过以下方式可视化(来自维基百科):

CBC decryption

你可以看到 IV 只对明文的前 16 个字节有贡献。如果 IV 在传输到接收方的过程中损坏,CBC 仍将正确解密除第一个以外的所有 block 。在 CBC 中,IV 的目的是使您能够使用相同的 key 加密相同的消息,并且每次仍然得到完全不同的密文(即使消息长度可能会泄露一些信息)。

其他模式的宽容度较低。如果你弄错了 IV,整个消息在解密时就会出现乱码。以 CTR 模式为例,其中 nonceIV 的含义几乎相同:

CTR mode

关于python - PyCrypto - 初始化向量如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com