locals()函数的文档特别警告不要修改其输出,因为解释器可能无法反映本地范围的更改.我假设这意味着Python规范不需要它,即使它在CPython中工作.
我想知道globals()是否相同.文档中没有任何警告,但我觉得奇怪的是,这会有所不同,因为每个函数显然在不同的范围内执行相同的操作.
如果它是安全的,修改globals()'输出将改善我正在处理的项目的简单性和兼容性.
我在应用程序中使用PyCrypto来加密数据,但由于某种原因,无论我做什么,前8个字节(对应于第一个块)都会损坏.
>>> from Crypto.Cipher import DES3
>>> from Crypto import Random
>>> iv = Random.new().read(DES3.block_size)
>>> key = Random.new().read(DES3.key_size[-1])
>>> des3 = DES3.new(key, DES3.MODE_CBC, iv)
>>> des3.decrypt(des3.encrypt('12345678abcdefgh12345678'))
't\x1b\x0f\xcbD\x15M\xababcdefgh12345678'
Run Code Online (Sandbox Code Playgroud)
我已经读到这是IV已损坏的迹象,但是这些消息来源还说使用CBC以外的模式会导致整个消息损坏.情况并非如此:
>>> des3 = DES3.new(key, DES3.MODE_CFB, iv)
>>> des3.decrypt(des3.encrypt('12345678abcdefgh12345678'))
'\xe1\x85\xae,\xf1m\x83\x9cabcdefgh12345678'
Run Code Online (Sandbox Code Playgroud)
我也可以排除密码的原因:
>>> from Crypto.Cipher import AES
>>> from Crypto import Random
>>> iv = Random.new().read(AES.block_size)
>>> key = Random.new().read(AES.key_size[-1])
>>> aes = AES.new(key, AES.MODE_CBC, iv)
>>> aes.decrypt(aes.encrypt('12345678abcdefgh12345678abcdefgh'))
'\xa7l\x00]\x1cW\xec\xd0\x04\x06\xba&\x1663\xd712345678abcdefgh'
Run Code Online (Sandbox Code Playgroud)
请注意,在此示例中,前16个字节已损坏,这对应于AES的块大小.