Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据损坏:其中';这是错误‽;_Python_Mcrypt_Cython_Python Extensions - Fatal编程技术网

Python 数据损坏:其中';这是错误‽;

Python 数据损坏:其中';这是错误‽;,python,mcrypt,cython,python-extensions,Python,Mcrypt,Cython,Python Extensions,上次编辑:我已经找出了问题所在(请参见下面我自己的答案),但我无法将问题标记为已回答,这似乎是错误的。如果有人能回答我在下面的回答中提出的问题,即,这是Cython中的一个bug还是Cython的预期行为,我会将该答案标记为已接受,因为这将是从中获得的最有用的教训,IMHO 首先,我必须首先说,我已经试着弄明白这一点三天了,我只是把头撞在墙上。从文档中可以看出,我做的事情是正确的。显然,我不能做正确的事情,因为如果我是,我不会有问题(对吗?) 无论如何,我正在为mcrypt与Python进行绑

上次编辑:我已经找出了问题所在(请参见下面我自己的答案),但我无法将问题标记为已回答,这似乎是错误的。如果有人能回答我在下面的回答中提出的问题,即,这是Cython中的一个bug还是Cython的预期行为,我会将该答案标记为已接受,因为这将是从中获得的最有用的教训,IMHO


首先,我必须首先说,我已经试着弄明白这一点三天了,我只是把头撞在墙上。从文档中可以看出,我做的事情是正确的。显然,我不能做正确的事情,因为如果我是,我不会有问题(对吗?)

无论如何,我正在为mcrypt与Python进行绑定。它应该同时适用于Python2和Python3(尽管它还没有经过Python2的测试)。它是可用的,链接的,因为它太大了,无法包含在文章中,而且我不知道我做错了什么,我甚至无法分离出可能是问题代码。显示问题的脚本是。该脚本只提供100个块,除了字母“a”(加密算法/加密模式使用的块大小),当然,作为往返的结果,应该得到一个“a”块。但事实并非总是如此。以下是单次运行的输出:

Wed Dec 15 10:35:44 EST 2010
test.py:5: McryptSecurityWarning: get_key() is not recommended
  return ''.join(['{:02x}'.format(x) for x in o.get_key()])

key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
key: b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
16
self test result: 0
enc parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'}
dec parameters: {'salt': '6162636465666768', 'mode': 'cbc', 'algorithm': 'rijndael-128', 'iv': '61626364616263646162636461626364'}
enc key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca
dec key: 01657ad5a9f91f29a047d2f25afc7b7f6e023f2c081cc803063158b5c999d0ca
Stats: 88 / 100 good packets (88.0%)

#5: b'aaaaaaaaaaaaaaaa' != b'\xa6\xb8\xf9\td\x8db\xf6\x00Y"ST\xc6\x9b\xe7'
#6: b'aaaaaaaaaaaaaaaa' != b'aaaaaaa1\xb3@\x8d\xff\xf9\xafpy'
#13: b'aaaaaaaaaaaaaaaa' != b'\xb9\xc8\xaf\x1f\xb8\x8c\x0b_\x15s\x9d\xecN,*w'
#14: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaaaa\xeb?\x13'
#49: b'aaaaaaaaaaaaaaaa' != b'_C\xf2\x15\xd5k\xe1XKIF5k\x82\xa4\xec'
#50: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaa+\xdf>\x01\xee'
#74: b'aaaaaaaaaaaaaaaa' != b'\x1c\xdf0\x05\xc7\x0b\xe9\x93H\xc5B\xd7\xcfj+\x03'
#75: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaaaw+\xed\x0f'
#79: b'aaaaaaaaaaaaaaaa' != b"\xf2\x89\x1ct\xe1\xeeBWo\xb4-\xb9\x085'\xef"
#80: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaa\xcc\x01n\xf0<'
#91: b'aaaaaaaaaaaaaaaa' != b'g\x02\x08\xbf\xa5\xd7\x90\xc1\x84D\xf3\x9d$a)\x06'
#92: b'aaaaaaaaaaaaaaaa' != b'aaaaaaaaaaaaaaa\x01'
2010年12月15日星期三10:35:44东部时间
test.py:5:McryptSecurityWarning:不建议使用get_key()
返回“”。join(['{:02x}'。在o.get_key()]中为x设置格式(x)
键:b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
键:b'\x01ez\xd5\xa9\xf9\x1f)\xa0G\xd2\xf2Z\xfc{\x7fn\x02?,\x08\x1c\xc8\x03\x061X\xb5\xc9\x99\xd0\xca'
16
自检结果:0
enc参数:{'salt':'6162636465666768','mode':'cbc','algorithm':'rijndael-128','iv':'6162636461626364'}
dec参数:{'salt':'6162636465666768','mode':'cbc','algorithm':'rijndael-128','iv':'6162636461626364'}
附件键:01657AD5A9F91F29A047D2F25AFC7B7F6E023F2C081CC803063158B5C99D0CA
dec键:01657AD5A9F91F29A047D2F25AFC7B7F6E023F2C081CC803063158B5C99D0CA
统计:88/100个好数据包(88.0%)
#5:b'aaaaaaaaaa'!=b'\xa6\xb8\xf9\td\x8db\xf6\x00Y“ST\xc6\x9b\xe7”
#6:b'aaaaaaaaaaaa'!=b'aaaaaaaaa1\xb3@\x8d\xff\xf9\xafpy'
#13:b'aaaaaaaaaaaa'!=b'\xb9\xc8\xaf\x1f\xb8\x8c\x0b\ux15s\x9d\xecN,*w'
#14:b'aaaaaaaaaaaa'!=b'aaaaaaaaaaaaaaaaaaa\xeb?\x13'
#49:b'aaaaaaaaaaaa'!=b''U C\xf2\x15\xd5k\xe1XKIF5k\x82\xa4\xec'
#50:b'aaaaaaaaaa'!=b'aaaaaaaaaaaaaaa+\xdf>\x01\xee'
#74:b'aaaaaaaaaa'!=b'\x1c\xdf0\x05\xc7\x0b\xe9\x93H\xc5B\xd7\xcfj+\x03'
#75:b'aaaaaaaaaaaa'!=b'aaaaaaaaaaaaaaaa w+\x\x0f'
#79:b'aaaaaaaaaa'!=b“\xf2\x89\x1ct\xe1\xeeBWo\xb4-\xb9\x085'\xef”

#80:b'aaaaaaaaa'!=b'aaaaaaaaaaa\xcc\x01n\xf0当使用错误的初始化向量(即使用不同的IV进行加密而不是解密)和密码选择时,我遇到了类似的结果。作为一种健全性检查,尝试从CBC切换到ECB

另一种可能性是,您的一个变量在不应该随机化的情况下被随机化(使用新的基于时间的种子)。在这种情况下,在加密和解密步骤之间设置延迟可能会导致数据损坏更频繁。

Oy,我讨厌这样做(回答我自己的问题),但我找到了答案:这是Cython的一个怪癖,我将不得不研究它(我不知道这是一个有意的怪癖,还是一个bug)

问题来自memcpy行。我将第二个参数强制转换为,它与pxd文件中的Cython定义相匹配,但显然这使Cython编译代码与使用不同,后者迫使Cython传递一个指向实际字节的指针,而不是(我猜?)指向Python对象/变量本身的指针

因此,与此相反:

cdef char* buffer = <char*>malloc(in_len)
memcpy(buffer, <const_void *>in_bin, in_len)
success = cmc.mcrypt_generic(self._mcStream, <void*>buffer, in_len)
cdef char*buffer=malloc(in_len)
memcpy(缓冲区、收件箱、收件箱)
success=cmc.mcrypt\u generic(self.\u mcStream,buffer,in\u len)
它必须是这样的:

cdef char* buffer = <char*>malloc(in_len)
memcpy(buffer, <char *>in_bin, in_len)
success = cmc.mcrypt_generic(self._mcStream, <void*>buffer, in_len)
cdef char*buffer=malloc(in_len)
memcpy(缓冲区、收件箱、收件箱)
success=cmc.mcrypt\u generic(self.\u mcStream,buffer,in\u len)

这是一个多么奇怪的怪癖。老实说,我希望所有演员都指向同一个位置,但演员似乎也会影响行为。

Python似乎已经绑定到了
mcrypt
:虚拟+1代表interrobang,真实+1代表问题。@Katrielex是的,但他们不在Cython中,也不在Python 3中工作,这是我的目标环境。我的目标是用一套既适用于Python 2又适用于Python 3的Pythonic、可维护的绑定来替换这些绑定。哈哈,我还以为这是一些Firefox渲染错误。(interrobang)FogleBird:我在沮丧的时候使用interrobang。我是Unicode的粉丝。☺有趣的是,当我使用ECB模式时,我得到了与输出完全相同的错误字节。同样的输出带有时间延迟(随机睡眠)在加密和解密步骤之间…好主意。谢谢你的建议。我收回这一点:我仍然得到错误的数据,但它们与CBC模式字节不同;它们在一次运行中彼此相同,但与CBC模式下的运行不同。仍然是一堆腐败的gobbledygook。
cdef char* buffer = <char*>malloc(in_len)
memcpy(buffer, <char *>in_bin, in_len)
success = cmc.mcrypt_generic(self._mcStream, <void*>buffer, in_len)