上次编辑: 我已经弄清楚了问题是什么(请参阅下面的答案),但我无法将问题标记为回答。如果有人可以回答我在下面的回答中的问题,即,这是Cython的错误,还是Cython的意图行为,我会标记 回答被接受,因为这将是从中获得最有用的教训,恕我直言。


首先,我必须首先说我一直在试图解决这个问题三天,而我只是把头撞在墙上。从文档中可以看出的最好,我正在正确地做事。显然,我不能正确地做事,因为如果我是,我不会有问题(对吗?)。

无论如何,我正在为McRypt对Python的束缚。它应该与Python 2和Python 3一起使用(尽管未测试Python 2)。它可用 在我的网站上, ,链接是因为它太大了,无法包括在帖子中,并且鉴于我不知道 什么 我做错了,我什至无法隔离可能是问题代码。显示问题的脚本是 也在我的网站上. 。该脚本只能将100个块馈入字母“ a”(无论在任何块大小中,加密算法/加密模式使用),当然,由于圆形tropti脚的结果,当然应该获得“ 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'

怪异的部分是 确切地 给定(算法,模式)对的情况相同。我可以更改算法,并且会导致不同的往返,但是当我不更改算法时,每次运行总是相同的。我绝对很难过。另外,您在上面的输出中看到的那样,始终是两行损坏的:第5和6、13和14块等等。这种模式正好指向。

我意识到我可能在这里问很多:我无法隔离一小件代码,并且可能需要对McRypt和Python的熟悉。 las,经过三天的脑海,我需要远离问题,所以我在这里发布此问题,希望当我摆脱困境时,也许也可能会(a)某人将看到我介绍一个错误,(b)稍后再回到问题时,我将能够看到我的错误,或者(c)某人或我自己可以找到我代码中可能不是错误的问题绑定过程或库本身中的错误。

我尚未完成的一件事是尝试使用另一个版本的McRypt库。我正在使用Cython 0.13,Python 3.1和McRypt 2.5.8的工作,所有这些都是由Ubuntu在Ubuntu 10.10(我从PYPI获得的Cython)分发的。但是我管理使用PHP应用程序的系统,这些应用程序正常运行,并且在没有数据损坏的情况下使用McRypt,并且在Ubuntu 10.10上使用McRypt,因此我没有理由相信这是McRypt的构建,所以只有离开……好吧,我的某个地方有些不对劲。 , 我认为。

无论如何,我感谢任何可以提供帮助的人。我开始觉得自己要疯了,因为几天来我一直在不停地处理这个问题,而且我感到解决方案可能就在我面前,但我看不到它。

编辑: :有人指出我应该使用memcpy而不是strncpy。我这样做了,但是现在,测试脚本表明 每一个 块是不正确的。比以前更加困惑的是……这是新的输出 在粘贴上.

编辑2: :我回到了计算机,然后再次查看它,我只是在各地添加印刷语句,以查找可能出错的地方。 RAW_ENCRYPT.STEP(输入)函数中的以下代码:

    cdef char* buffer = <char*>malloc(in_len)
    print in_bin[:in_len]
    memcpy(buffer, <const_void *>in_bin, in_len)
    print "Before/after encryption"
    print buffer[:in_len]
    success = cmc.mcrypt_generic(self._mcStream, <void*>buffer, in_len)
    print buffer[:in_len]

第一个打印说明显示了预期的东西,即传递的纯文本。但是,第二个内容显示了完全不同的东西,这应该是相同的。似乎Cython发生了一些我不完全理解的事情。

有帮助吗?

解决方案

OY,我不愿意这样做(回答我自己的问题),但我找到了答案:这是Cython的怪癖,我将不得不研究(我不知道这是否是预期的怪癖,或者是否是怪癖这是一个错误)。

问题出在纪念行。我将第二个参数投入到u003Cconst_void*>,它与PXD文件中的Cython定义匹配,但显然这使Cython的编译与使用不同u003Cchar*>,后者迫使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 = <char*>malloc(in_len)
memcpy(buffer, <char *>in_bin, in_len)
success = cmc.mcrypt_generic(self._mcStream, <void*>buffer, in_len)

多么奇怪的怪癖。老实说,我希望任何演员都可以指向同一位置,但是看来演员也会影响行为。

其他提示

当使用错误的初始化向量(即使用与解密的不同的IV进行加密)和CIPHERMODE选择的组合结合在一起时,我遇到了与此相似的结果。作为理智检查,尝试从CBC切换到欧洲央行。

另一种可能性是,当您不应该的情况下,您的一个变量是随机化的(具有新的基于时间的种子)。在这种情况下,您可以通过在加密和解密步骤之间延迟延迟来使数据损坏发生更频繁地发生。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top