众所周知,明信片这种东西,你在上面写了啥大家都看得到,所以基本上就不能写啥很私密的东西,但是邮政的邮资,明信片全国统一价8毛钱啊,省的买天平什么的,如果能在这上面实现一下隐私通讯,那岂不美哉?吾辈乃是程序员啊,一个程序员不会个什么base64编码、aes加密解密,那简直就是丢人2333
编码
与加密不同的是,编码将数据转化成某种固定的格式的编码信息,通过解码编码信息可以得到原始信息。其间不涉及任何事先约定好的密码之类的东西。比如常用的Base64、Zip、QRCode、PDF-417。如果说是写在明信片上的话,前面两种可输出为字符的方式还能够接受,如果是最后的PDF-417的话,算了吧,我不想在上面画个二维码出来2333
以上是公开的编码,另一种我个人认为算得上是编码的,就是在颠倒的帕特玛最后面老爷爷手里的信一样,看似一坨乱码实际则有迹可循,经过一番研究便得出了完备的对照表,而这个工作谁都可以完成,因此我个人不认为这是加密。
因此我想到的手段有:
- 将文字通过Base64等编码方式进行编码,如果是有灵性的程序员看到一段乱码,尤其是后面还附带几个等号的,通常就会想到是Base64,因此在解密上不存在任何困难,只是期望对方别打错字符就好了。但是另一方面,由于Base64实在是太普遍了,因此这个不可行。
- PDF-417二维码,我挺喜欢这个二维码的,能够携带的数据量挺高,而且多数手机app(如微信、相机自带的扫码功能)都不支持这个,因为这个在安全证件上用的比较多,因此就目前而言,如果不是老司机,还是挺难看出来的。但是就是有一点不好,你得手动画上去。
- 使用自己的字母表对照数字,将文字做成一个谜题,让接收者根据密文寻找其中的规律,这对于编码和解码都有一定的要求,至少你得让人有据可循,有足够的语料让人发现规律,最重要的一点就是别让让接收者骂娘然后当垃圾扔掉2333
- 当然,还有一种终极方法,比如给英国寄信用希伯来语,给中国寄信用俄语,反正就学一些小众的语言,我就不信有那么寸就能让别人碰见。某人指着别人的明信片:诶这上面的字我认识!这种情况就尴尬了。除此之外还有就是对方不认得上面写的是啥,见到希伯来语,对方一脸懵逼,那就。。。。
加密
加密的方法有很多啊,但是无数加密方法都要求双方必须持有一些私密的东西,这对于只用明信片通讯的方式就有些棘手了。历史上加密的手段有很多,这里就不多赘述了,说一说现代的加密方法吧2333
我最喜欢的就是AES加密,Java支持的是AES-256-CFB,但是我更偏好于AES-256-GCM,前者是优秀的加密算法,后者则在此基础上增加了完整性验证的功能,能够告诉接收者明信片是否被修改过。至于这些加密算法的实现,各个程序语言已经有成型的库可供引用,在此则不多赘述了。
摘要
这个是我临时想起来的,对于最上面的说的两类方法,除了GCM这种加密方式之外,其他的,例如AES采用块加密,编码方式也同样针对字符或者固定长度,因此当密文被截取掉一段之后,前面的内容不受影响,不考虑语义,那么如果截取的得当的话是不会出现再还原过程中出现受损的原文的,可是你该如何知道文件的内容是否被修改呢?
信息摘要算法就是你所需要的。例如SHA-1、MD5这些著名的摘要算法以其不可逆性(目前而言)而著称,因此你可以很方便的通过计算还原后密文的摘要值来确认是否被修改过。
总结
上面说到了三类方法,但其实可以相互配合,比如在实际应用中你会将AES加密后的数据块变成Base64输出成字符,在辅之以摘要算法可供收件人验证信件的完整性。诸如此类先加密后编码,再使用摘要算法这样的工作流程是很常用的。另外考虑到明信片上可容纳的信息量,PDF-417是最好的解法,但是因为它难以使用家用打印机印刷于明信片之上,因此被我否决了。而且考虑到可操作性,将计算机生成的字符一个一个手抄到明信片上,再将其一个一个打回计算机上,有点繁琐。因此我比较偏好于类似帕特玛的信那种,我觉得这个可行,在未来可以尝试一下。
【歪门邪道】基于邮政明信片的隐私通讯的密码学讨论 由 天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。