【发布时间】:2019-01-09 10:22:20
【问题描述】:
我正在尝试使用 pycryptodome 库实现 AES 加密的 OFB 模式,但在理解我应该向密码提供什么输入时遇到问题。我知道 pycryptodome 已经实现了 OFB,但我需要将纯文本分解为字节,应用 OFB 的正确步骤,使用 ECB 模式的 AES 密码对其进行加密,然后对其进行解密。
b'\x16\xa8W\xed.)\xc4\xb8x\xd6\xcf\x7f\xf3\xe3;^' 等字节字符串在 python 中是如何工作的?
我需要获取这样一个字节字符串,对其进行加密,然后将其分成两半并与纯文本的 8 个字节进行异或。我理解和做到这一点的最简单方法是使用 AES 加密 IV(上面的字节字符串),然后将其和纯文本转换为二进制并对它们进行异或,然后将它们转换回字节字符串。我该怎么做?
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
plainText = b"Lorem ipsum dolor sit amet, consectetur adipiscing e"
key = b"ANAAREMEREAAAAAA"
iv = get_random_bytes(32)
print("iv: ", iv)
cipher = AES.new(key, AES.MODE_ECB)
toXor = cipher.encrypt(iv)
print("toXor: ", toXor)
"""
toXorF=first half of toXor
ivS=second half of iv
cipherText=toXorF xored to first 8 bytes of plainText
iv=ivS + toXorS
"""
打印输出:
iv: b"v'xg;\xd7h\xfc\xf2\xa4[\r\xee]J\x1eu\xa5\xe68\xa3a\xde\x02(\xc1\xe0\xc9z\x0f\xc3n"
toXor: b'\x97\xbex\xfc\xb6\xbb\x85\xccZ\xc4\xe4\x9d\xd6M\xf2\xd7\xb7\xbf\xd0\xbe\xa5A\xd6\xee\x07U\xe0S\x7f\x88\xea\xcd'
如果您对我的程序的更好架构/解决我的问题的方法有任何建议,请随时启发我。
【问题讨论】:
-
字节串是二进制数据,你不必转换它们。如果您询问如何将密钥流与明文异或,您可以使用
ciphertext = bytes([ks[i] ^ pt[i] for i in range(16)])。对于下一个块,使用密钥流作为 IV(参见diagram)。请注意,您必须使用 16 字节的 IV 并将明文“剪切”为 16 字节的块。 -
我发现了一些例子,它说我应该将密钥流用作下一个块的 iv,而其他人说新 iv 是旧 iv 的后半部分 + 密钥流的前半部分。当我运行使用 pycryptodome 的 AES 和 OFB 加密文本的标准代码时,我得到最终 iv 的以下输出:OI83f0NCCXSVhDT5bQkb/A== 大小为 24 个字节。我应该打破密钥流还是应该保持原样并继续加密它? (只是为了确保 keystream= iv 使用提供的密钥加密,对吗?)
-
我认为这行不通,您可以分享这些示例的链接吗?你得到的 IV 似乎是 base64 编码的;如果你解码它,你会得到一个 16 字节的字符串。如果它是用AES-ECB加密的,base64解码它并与明文进行异或得到密文。 (是的,keystream= iv 使用提供的密钥加密)
-
嗯我不知道这个实现,我得研究一下,谢谢!但是我认为只有第二个视频使用了这种方法,我怀疑 PyCryptodome 或大多数其他加密库都在使用它。
标签: python python-3.x cryptography aes pycryptodome