构建一款基于 OpenCV 的光学打孔卡读取器,适用于 128 位的打孔卡
扫描二维码
随时随地手机看文章
如今,穿孔卡片已几乎被人遗忘,使用这种卡片的最后一批机器早在 80 年代就已退役。不过也有一些例外情况,一些工业设备至今仍得以保留,并且在小范围内仍在使用这种卡片。
穿孔卡片的最大缺点在于它们存储的信息量很少。过去,它们通常只有 72 个字节,而要编写一个 Fortran 或 Algol 程序就需要大量的这种卡片。不过,它们也有一些有趣的优势,比如很难被破解,而且可以由几乎坚不可摧的材料制成,比如不锈钢,也可以由非常容易损坏的材料制成,比如易溶解的纸张。
设计一张新的投币卡
从零开始制作一张新的打孔卡可以让您自行决定许多此类事项。通过光学识别技术,孔的位置非常适合 1:0 比例,因为使用 OpenCV 可以很容易地找到这些位置。对于 128 字节的大小来说,这是一个很好的值,因为您可以使用该信息级别存储一个非常安全的随机密码。大约 120x70 毫米的卡尺寸足够小,可以放在后口袋里,或者系在脖子上的漂亮项链上以确保安全存放。
在使用 OpenCV 进行处理时,进行某种错误校正或检测也是很有用的。因此,我添加了一个奇偶校验位,它可作为穿孔卡片上每个字节的校验和。至于孔的大小,我经过测试发现 3 毫米对于识别和 3D 打印来说都效果不错。
阅读一张穿孔卡片
读取卡片信息是通过一个位于暗色桌子上方 200 毫米处的罗技 920 HD 网络摄像头来完成的,该卡片由浅灰色塑料制成。在卡片上覆盖一个栅格,然后测量矩阵中每个点的颜色。如果颜色较暗,则表示有孔洞,就在矩阵中填入“1”。如果颜色为灰色,则该值为“0”。
该程序可以通过按 WASD 键来在图像上移动像素点(分别用于水平和垂直移动),并使用 IO 键进行旋转操作。还可以通过 GH 键来缩放图像。按 shift 键可以加快移动速度。对于所使用的这张卡片,生成的扫描结果如下所示。
那么它们是用来做什么的呢?
嗯,打孔卡片有很多用途呢!
•妥善保管长密码
•用作锁具中的钥匙卡
•比特币钱包
•用于教育目的,以教授计算机历史知识
•让孩子们尝试使用二进制数值,并学习数学知识
•加密密钥
一张卡能存储多少数据?
使用更大的卡片是完全可行的,或许 64 字节的容量是有可能实现的,但那样的话容量就相当于一张 A4 纸的大小了。而且还可以使用多张卡片来一起承载信息。
尽管这张卡存储了 127 位数据,但如果你只使用 94 个可打印的 ASCII 字符(字母、数字和特殊符号),那么实际的熵值仅为 105 位。而这张卡实际上有 143 位,但我的标准使用其中的 16 位来进行奇偶校验控制。即便 80 位在如今也被认为是足够安全的了。
共同的秘密?
没问题!一张卡片可以被分成若干部分,只有将这些部分组合在一起,卡片的所有者才能获得密码。除非某人只拿到了其中的一部分信息,那么这部分信息可以通过奇偶校验位计算出来。
使用里德-索罗门算法进行数据恢复与错误校正
使用奇偶校验位可以允许每个字节中有一个位丢失,但实际丢失的位数可能会更多。一种可行的方法是采用里德-索尔曼纠错技术,这种技术在很多应用中都有使用,包括“旅行者”号太空探测器。
使用 RSCodec Python 库中的 reedsolo 进行一些实验,您可以测试不同的安全级别。在卡上使用 12 个字节的数据,可以为 ECC 空间留出 4 个字节,总共为 16 个字节。这应该能够提供恢复两个完全损坏的字节或四个已知缺失字节的可能性。
将长度为 10 个字节的“helloworld”消息用 6 个纠错码字节进行编码,总共会得到 16 个字节。用 Python RS 码编码后的消息为 [104, 101, 108, 108, 111, 119, 111, 114, 108, 100, 192, 96, 126, 3, 95, 130]。一些测试表明,它确实有效,并且能够恢复丢失的位。
制作卡片
使用所提供的 Python 脚本,您可以快速以 SCAD 格式创建密钥,并将其导出为 STL 格式以用于制造。
改进型卡片,第二代
对这张卡片进行了改进并进行了读取操作,现在它的长度为 16 个字节,还包含一个校验字节,位于卡片的最后位置。
本文编译自hackster.io





