数据损坏:错误在哪里‽

2023-12-26

最后编辑:我已经弄清楚问题是什么(请参阅下面我自己的答案),但我似乎无法将问题标记为已回答。如果有人可以回答我在下面的回答中提出的问题,即这是 Cython 中的错误还是这是 Cython 的预期行为,我将标记that答案被接受,因为这将是从中获得的最有用的教训,恕我直言。


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

无论如何,我正在研究 mcrypt 到 Python 的绑定。它应该适用于 Python 2 和 Python 3(尽管它尚未针对 Python 2 进行测试)。可用在我的网站上 http://mike.trausch.us/software/mcrypt-0.0.0.tar.gz,链接是因为它太大而无法包含在帖子中,并且考虑到我不知道what我做错了,我什至无法隔离可能有问题的代码。显示问题的脚本是也在我的网站上 http://mike.trausch.us/software/test.py。该脚本只提供 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'

奇怪的是它是exactly对于给定的(算法,模式)对也是如此。我可以更改算法,这将导致不同的往返,但当我不更改算法时,每次运行总是相同的。我完全被难住了。另外,正如您在上面的输出中看到的那样,总是有两个连续的块被损坏:块 5 和 6、13 和 14 等。所以,有一个模式,但无论出于何种原因,我无法弄清楚该模式准确指向什么。

我意识到我可能在这里问了很多问题:我无法隔离一小段代码,并且可能需要熟悉 mcrypt 和 Python。唉,经过三天的思考,我需要暂时远离这个问题,所以我把这个贴在这里,希望也许当我暂时摆脱这个问题时,(a)某人将看到我在哪里引入了错误,(b)当我稍后回到问题时,我将能够看到我的错误,或者(c)某人或我自己可以找到问题,这可能不是我的代码中的错误,但是绑定过程或库本身的错误。

我没有做的一件事是尝试使用 mcrypt 库的另一个版本。我正在使用 Cython 0.13、Python 3.1 和 mcrypt 2.5.8 进行工作,所有这些都是由 Ubuntu 在 Ubuntu 10.10 中分发的(除了 Cython,它是我从 PyPi 获得的)。但是我使用 PHP 应用程序管理系统,这些应用程序运行良好,并且在 Ubuntu 10.10 上使用 mcrypt 没有数据损坏,所以我没有理由相信它是 mcrypt 的构建,所以这只留下了......好吧,我在某个地方出了问题, 我认为。

无论如何,我非常感谢任何能够提供帮助的人。我开始觉得自己快要疯了,因为我已经连续几天不间断地研究这个问题,而且我感觉解决方案可能就在我面前,但我看不到它。

Edit:有人指出我应该使用 memcpy 而不是 strncpy。我这样做了,但现在测试脚本显示every块不正确。让我比以前更加困惑......这是新的输出在pastebin上 http://pastebin.com/sA0RtZK7.

Edit 2:我回到计算机并再次查看它,我只是在各处添加打印语句以查找可能出现问题的地方。 raw_encrypt.step(input) 函数中的以下代码:

    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 发生了一些我不完全理解的事情。


哦,我讨厌这样做(回答我自己的问题),但我找到了答案:这是 Cython 的一个怪癖,我必须研究它(我不知道这是否是有意的怪癖,或者如果这是一个错误)。

问题出在 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 = <char*>malloc(in_len)
memcpy(buffer, <char *>in_bin, in_len)
success = cmc.mcrypt_generic(self._mcStream, <void*>buffer, in_len)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据损坏:错误在哪里‽ 的相关文章

  • python sys.path 故障排除

    python 文档位于http docs python org library sys html http docs python org library sys html比如说sys path is 从环境变量 PYTHONPATH 以及
  • 蟒蛇 | MySQL | AttributeError:模块“mysql.connector”没有属性“connect”

    我正在学习 python 中的一个新库 mysql 我尝试执行以下命令 import mysql connector mydb mysql connector connect host localhost user root passwd
  • 当我有自定义身份验证模型时,如何登录 Django Rest 可浏览 API?

    我有一个自定义用户模型 如下所示account models py from django contrib auth modles import AbstractUser from django db models signals impo
  • 如何避免使用 python 处理空的标准输入?

    The sys stdin readline 返回之前等待 EOF 或新行 所以如果我有控制台输入 readline 等待用户输入 相反 我想打印帮助并在没有需要处理的情况下退出并显示错误 而不是等待用户输入 原因 我正在寻找一个Pytho
  • 如何使用 Python 3 绕过 HTTP Error 403: Forbidden with urllib.request

    您好 不是每次都这样 但有时在尝试访问 LSE 代码时 我会收到每一个烦人的 HTTP 错误 403 禁止消息 任何人都知道我如何仅使用标准 python 模块来克服这个问题 遗憾的是没有漂亮的汤 import urllib request
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 使用 Django 将文件异步上传到 Amazon S3

    我使用此文件存储引擎在上传文件时将文件存储到 Amazon S3 http code welldev org django storages wiki Home http code welldev org django storages w
  • Arcpy 模数在 Pycharm 中不显示

    如何将 Arcpy 集成到 Pycharm 中 我尝试通过导入模块但它没有显示 我确实知道该模块仅适用于 2 x python arcpy 在 PyPi Python 包索引 上不可用 因此无法通过 pip 安装 要使用 arcpy 您需要
  • 如何使用scrapy检查网站是否支持http、htts和www前缀

    我正在使用 scrapy 来检查某些网站是否工作正常 当我使用http example com https example com or http www example com 当我创建 scrapy 请求时 它工作正常 例如 在我的pa
  • Python HMAC:类型错误:字符映射必须返回整数、None 或 unicode

    我在使用 HMAC 时遇到了一个小问题 运行这段代码时 signature hmac new key secret key msg string to sign digestmod sha1 我收到一个奇怪的错误 File usr loca
  • Python Anaconda:如何测试更新的库是否与我现有的代码兼容?

    我在 Windows 7 机器上使用 Python 2 7 Anaconda 安装进行数据分析和科学计算 当新的库发布时 例如新版本的 pandas patsy 等 您建议我如何测试新版本与现有代码的兼容性 是否可以在同一台机器上安装两个
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • 两个不同长度的数据帧的列之间的余弦相似度?

    我在 df1 中有文本列 在 df2 中有文本列 df2 的长度将与 df1 的长度不同 我想计算 df1 text 中每个条目与 df2 text 中每个条目的余弦相似度 并为每场比赛给出分数 输入样本 df1 mahesh suresh
  • Python 中维基百科 API 中的 DisambiguationError 和 GuessedAtParserWarning

    我想获得维基百科与搜索词相关的可能且可接受的名称列表 在这种情况下是 电晕 当输入以下内容时 print wikipedia summary Corona 这给出了以下输出 home virej local lib python3 8 si
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • Django 管理器链接

    我想知道是否有可能 如果可以的话 如何 将多个管理器链接在一起以生成受两个单独管理器影响的查询集 我将解释我正在研究的具体示例 我有多个抽象模型类 用于为其他模型提供小型的特定功能 其中两个模型是DeleteMixin 和GlobalMix
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • python从二进制文件中读取16字节长的双精度值

    我找到了蟒蛇struct unpack 读取其他程序生成的二进制数据非常方便 问题 如何阅读16 字节长双精度数出二进制文件 以下 C 代码将 1 01 写入二进制文件三次 分别使用 4 字节浮点型 8 字节双精度型和 16 字节长双精度型
  • 定义在文本小部件中双击时选择哪些字符

    在 Windows 上 双击文本小部件中的单词也将选择连接的标点符号 有什么方法可以定义您想要选择的角色吗 tcl wordchars该变量的值是一个正则表达式 可以设置它来控制什么被视为 单词 字符 例如 通过双击 Tk 中的文本来选择单
  • 无法安装最新版本的 Numpy (1.22.3)

    我正在尝试安装最新版本的 numpy 即 1 22 3 但看起来 pip 无法找到最后一个版本 我知道我可以从源代码本地安装它 但我想了解为什么我无法使用 pip 安装它 PS 我有最新版本的pip 22 0 4 ERROR Could n

随机推荐

  • Highcharts:每个系列是否可以有单独的绘图选项?

    我想在图表上有两个散点系列 一个线宽为 1 另一个没有线宽 据我了解 plotOptions适用于指定类型的所有图表 因此所有散点图要么有线宽 要么没有 是否可以将plotOptions应用于特定系列 除了下面列出的成员之外 该特定类型图的
  • 如何在 vue.js webpack 项目上正确设置 favicon.ico?

    我创建了一个vue webpack项目使用vue cli vue init webpack myproject 然后在下面运行该项目dev mode npm run dev 我收到这个错误 无法加载资源 服务器响应状态为 404 未找到 h
  • 如何在 SAML 2.0 Web 浏览器 SSO 的 AuthnRequest 中识别主体

    我是 SAML 新手 在完全理解完整的 SAML2 SSO 流程方面遇到了一些困难 具体来说 当服务提供商使用元素响应资源请求时 元素中的哪一部分数据标识要由身份提供商验证的主体 即用户 例如 在以下 AuthnRequest 中似乎没有任
  • scipy.stats.binned_statistic_dd() 中的输出

    我正在尝试使用scipy stats binned statistic dd http docs scipy org doc scipy reference generated scipy stats binned statistic dd
  • 安装tensorflow 2有问题

    我想练习tensorflow 2 但我尝试在anaconda环境中安装它失败了 我的问题是 如何安装tensorflow 2 如果可以在 anaconda 环境中完成 在我看来会更方便 我不需要理解下面的错误信息 只要我能使用tensorf
  • 使用代码中的“fb_ref”参数跟踪来自 Facebook 的点赞按钮推荐

    我们想使用属性fb ref 点赞按钮中的 ref 参数 以便跟踪推荐点击和转化 您是否有关于如何在我们的页面上进行此操作的教程或示例 当您使用ref点赞按钮上的参数 点击返回由该点赞按钮生成的网站 在引荐来源网址中包含两个额外参数 fb r
  • 在哪里可以阅读有关编程的内容? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ASP.NET MVC 将列表传递给 RouteData QueryString

    将值列表作为查询字符串传递的推荐方法是 www site com search value 1 value 2 value 3 value 4 ASP NET 很好地处理了这个问题 string value QueryString Get
  • 文件传输详细信息持续绑定,直到使用 WPF 在窗口中传输文件

    我已经创建了将文件从客户端传输到服务器的项目 我已经完成了文件传输并获取了文件传输的详细信息 例如文件名 something avi 和传输的文件百分比 10 如下所示 每当我传输文件时 我都会使用下面的事件处理程序来了解该文件转移的详细信
  • 如何进入封闭班? [复制]

    这个问题在这里已经有答案了 I know Class getDeclaredClasses 可以获取它声明的所有类 但不包括匿名类 我想知道有没有办法通过封闭类获取所有封闭类 例如 我想获取定义在中的所有封闭类Root用于测试目的 clas
  • 如何在 WPF 中创建可拖动到主窗口之外的面板?

    尝试在 Visual Studio 2008 中复制对接控件 我的应用程序为 FAA 重播 RADAR 环境 并且我希望双显示器用户能够将控制面板拖动到另一个显示器 以使主画布保持清晰 此功能类似于将 VS 中的不同面板拖到主窗口之外的方式
  • MIPS 伪指令、替换

    经过研究后 我发现这只是获得相同结果的方法的替代 如果我错了 请纠正我 example move s0 t1 可以替换为 add s0 zero t1 问题 怎样才能更换lw la sw bne 是的move指令可以并且被替换为add操作说
  • 当我使用 Control-C 中断 C# 控制台应用程序时会发生什么?

    当我使用 Control C 中断 C 控制台应用程序时会发生什么 进程被杀死了吗 内存被释放了吗 是finally块被执行 数据库连接会发生什么情况 如果应用程序是为调试或发布而构建的 或者在 Visual Studio 内部 外部运行
  • Angular 动态组件 AOT 问题

    由于一些业务逻辑 我必须读取动态组件 EntryComponents 的元数据 要读取元数据 以下是我的方法 使用读取模块的所有组件组件工厂解析器 使用组件名称和特定方法过滤掉类 创建组件并读取数据 销毁该组件 const factorie
  • 如何对多个项目使用 ETag / If-Match

    在 RESTful 接口中处理乐观锁定的推荐方法似乎是返回一个ETag来自 GET 并提供If Match在 PUT 上 即 GET items 1 gt gives client an ETag for a single item PUT
  • 从块返回 UIImage

    我有以下代码 UIImage getPublisherLogo check the cache if the logo already exists NSString imageUrl NSString stringWithFormat i
  • 与 Eclipse 编译器相比,为什么 javac 1.5 运行速度这么慢?

    我有一个 Java Maven 项目 其中包含大约 800 个源文件 其中一些由 javacc JTB 生成 使用 javac 编译需要花费 25 分钟 当我将 pom xml 更改为使用 Eclipse 编译器时 编译大约需要 30 秒
  • Qt 会泄漏内存吗?

    如果我编译这个 Qt hello world include
  • Python需要安装ipykernel

    我在 VS code 中使用 Jupyter Notebook 时遇到问题 屏幕显示 Python 3 7 8 requires ipykernel to be installed 我按照弹窗安装了ipykernel 还是不行 附上截图 很
  • 数据损坏:错误在哪里‽

    最后编辑 我已经弄清楚问题是什么 请参阅下面我自己的答案 但我似乎无法将问题标记为已回答 如果有人可以回答我在下面的回答中提出的问题 即这是 Cython 中的错误还是这是 Cython 的预期行为 我将标记that答案被接受 因为这将是从