如何使用 dmtxread 读取扫描的数据矩阵?

如何使用 dmtxread 读取扫描的数据矩阵?

我正在尝试读取从私有 2096 位加密 RSA 密钥生成的数据矩阵。

密钥是使用gpg以下命令生成并打印为 PDF 的:

gpg --export-secret-key MY_PRIVATE_KEY_ID | paperkey --output-type raw | dmtxwrite -e 8 -f PDF > ~/key.pdf

然后我打印key.pdf并扫描它,生成以下 jpg 文件:

在此输入图像描述

我现在想使用以下命令重新创建我的私钥:

dmtxread /path/to/image.jpg | paperkey --pubring ~/.gnupg/pubring.gpg > my-regenerated-private-key.gpg

但是,该命令dmtxread不打印任何内容stdout并返回1。我尝试过使用 来修改错误-C 10000,使用 来减少旋转容差-q 5,并增加图像的画布大小以增加矩阵左侧和右侧的空白像素数量。我还尝试使用更高分辨率的扫描(我不知道 DPI,但它是 4MB,并且正方形定义得很好)并使用 和 调整对比度容差-t 20-t 5所有结果都相同(尽管我必须使用跳过像素-S 5使用这个大文件可以在 30 分钟内完成)。

我尝试使用--verbose但没有打印任何内容stdout(或据我所知任何诊断文件)。

我还尝试过-D生成诊断图像的选项。但我不太确定如何看待结果:

在此输入图像描述

显然它正在与一些边界作斗争,但我不确定为什么或如何变得dmtxread更加健壮。

我的下一步将尝试使用恢复的私钥解密虚拟文件,但显然我没有做到这一点。

令人失望的是,这是如此困难;如果没有简单的方法使用命令行libdmtx工具来执行此操作,也许还有另一个工具可以为我开箱即用地执行此操作?

重要的:不用说,我永远不会使用这个私钥进行任何实际的加密,既然我已经在网上分享了它。您永远不应该分享您的私钥。

答案1

看起来,我设法从你的图像中获取数据。
我做了以下事情:

  1. 使用 GIMP 打开
  2. 颜色 -> 阈值
  3. 将滑块放置在中心周围(我不记得我选择的确切值),然后单击“确定”
  4. 图像 -> 画布尺寸
  5. 选择百分比
  6. 画布尺寸:宽度:160%
  7. 画布尺寸:高度:120%
  8. 偏移:点击“中心”
  9. 单击调整大小
  10. 工具 -> 变换工具 -> 旋转工具
  11. 角度:-0.50 并单击“旋转”(在执行此操作之前添加垂直参考线很有用)
  12. 文件 -> 导出为
  13. 选择文件名并单击“导出”,然后单击“导出”(使用所有默认值)

这是我在完成所有这些步骤后得到的图像:
固定扫描

运行 dmtxread 会给出即时结果(不到一秒):
dmtxread --shrink=2 c8wcN1B.jpg > quant.paperkey
大小为 1428 字节,前两个八位字节看起来像二进制 paperkey 格式。
核实生成的文件, 你可以在这里下载

答案2

我正在使用 dmxtread 解码更简单的数据矩阵条形码,22x22 或 26x26。我发现,如果设置为 -S2 (跳过每隔一个像素),设置 -S 跳过像素参数会有所帮助,但跳过任何更大的数字会降低图像(打印在塑料上的条形码的照片)的可解码性。

dmtxread -n -v -S2 -N1 -D imagename.png 

对我来说这是一个典型的命令,其中 -N 表示在解码一个字符串后停止查看(因为我的条形码只包含一个)。正如您所发现的,解码失败只会返回一个新的命令提示符行。

查看您的诊断图像,我会注意到较暗的左侧和底部边缘几乎没有活动 - 这是 dmtx 找到条形码的地方,然后移动到空间的中心并开始读取像素。我的图像往往在那些黑暗边缘上有更多的活动。

您的图像看起来足够清晰,-t 参数起不了多大作用,我发现此参数对图像的可解码性没有帮助。

我假设您的命令旨在让 dmtxread 进行解码,然后将密钥写入您指定的 .gpg 文件。现在,我将删除它并让 dmtxread 仅输出到 shell 或简单的文本文件,以消除它作为潜在的错误源。

相关内容