- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图了解 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,解密可以通过以下方式可视化(来自维基百科):
你可以看到 IV 只对明文的前 16 个字节有贡献。如果 IV 在传输到接收方的过程中损坏,CBC 仍将正确解密除第一个以外的所有 block 。在 CBC 中,IV 的目的是使您能够使用相同的 key 加密相同的消息,并且每次仍然得到完全不同的密文(即使消息长度可能会泄露一些信息)。
其他模式的宽容度较低。如果你弄错了 IV,整个消息在解密时就会出现乱码。以 CTR 模式为例,其中 nonce 与 IV 的含义几乎相同:
关于python - PyCrypto - 初始化向量如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716338/
有人可以帮助我吗?本指导剂量工作: PyCrypto on python 3.5 命令行: creating build\temp.win32-3.6\Release\src C:\Program
我正在尝试在 CryptoJS 上解密并在 PyCrypto 上加密。 我看到 this 一个很好的答案,就像魅力一样,唯一的问题是它调整 PyCrypto 以与 CryptoJS 一起工作,我更喜欢
我需要 pycrypto 因为它需要使用 dnspython 库的一些函数。我在网上发现一些帖子暗示 pycrypto 已死。但是,我需要 dnspython 并且别无选择,只能使用它。我什至尝试安装
我正在使用 PKCS1_OAEP 加密算法来加密文件。文件加密成功,但无法解密文件,报错“Ciphertext with incorrect length”。 加密算法在这里: #!/usr/bin/
我试图让 2 个程序使用公钥在网络上共享加密数据,但我遇到了一个难题:共享的信息( key 和/或加密数据)似乎被修改了。我希望保持加密数据格式和 key 格式尽可能简单,以便与其他语言兼容。为了解决
如何将 pycrypto 与 GAP 结合使用? 它说 here它不支持最新版本。这是否意味着我必须使用他们指出的版本? 我试过了,但是,当我执行 setup.py 时我收到错误 src/MD2.c:
ValueError: invalid version number '2.20.51.20100613' 我在安装 pycrypto 时遇到问题。尝试过包管理器:pip & easy_install
仍然不能让它正常工作。我的问题是关于如何使解密线工作。这是我写的: class IVCounter(object): @staticmethod def incrIV(self):
我从 JS RSA 库 (http://www-cs-students.stanford.edu/~tjw/jsbn/) 加密纯文本并从 python Crypto.PublicKey 解密。 但是,
我在使用 PyCrypto 时遇到了重大问题,如下面的代码所示。一个问题是测试用例不会以可重复的方式失败,而是在使用不同 key 的不同平台上有不同的原因。 请注意,测试用例为 Alice 和 Bob
我已经使用 pycrypto 生成了公钥和私钥,并使用导出 key 将它们保存到一个文件中: from Crypto.PublicKey import RSA bits=2048 new_key =
我试图了解 PyCrypto 如何在项目中使用,但我没有完全理解初始化向量 (IV) 的重要性。我发现在解码字符串时我可以使用错误的 IV,而且除了前 16 个字节( block 大小)之外,我似乎仍
我正计划在一个项目中使用 PyCrypto,我想知道 PyCrypto 是否足够安全可靠,可以使用。如何确保 PyCrypto 根据 RSA 和 AES 等各种加密算法正确加密数据? 最佳答案 视情况
我尝试使用 pip 在 python 3.6.0 上安装 pysnmp(使用 pycrypto),但出现错误: Command ""c:\program files (x86)\python36-32
我使用 pycrypt 库编写了一些代码,我一定做错了什么,但我不知道我做错了什么。我(几乎)可以用错误的初始化向量解密消息,即使我相信我正在遵循他们的示例。 from Crypto.Cipher i
我在 web.py 中构建应用程序,但在将加密数据存储在 MySQL 中时遇到了一些问题。 PyCrypto 创建的密码文本看起来像:'\x06\x7f\x81\xa0\xf4d\x00H\xef\x
我正在使用 Pycryptodome(一个 PyCrypto 分支)来创建 AES-GCM 密文。我使用以下 Python 代码进行加密: cek = os.urandom(16) nonce = o
我正在尝试了解用于公钥和私钥的 pyCrypto 加密和解密方法,但我看到了一些奇怪的东西。假设我有一组私钥和公钥,存储在文件 dummy_private.txt 和 dummy_public.txt
我正在尝试对哈希执行盲化和非盲化。 以下: https://gdata-python-client.googlecode.com/hg/pydocs/gdata.Crypto.PublicKey.RS
创建了一个带套接字的客户端-服务器应用程序,我正在尝试将签名从客户端传输到服务器。我将它从元组转换为字符串,然后再转换回元组。但签名停止工作。如何解决? from Crypto.Hash import
我是一名优秀的程序员,十分优秀!