找回密码
 立即注册
注册 登录
×
热搜: 活动 交友 discuz
查看: 81|回复: 2

Emoji密码学

[复制链接]

2

主题

3

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-11-30 11:53:24 | 显示全部楼层 |阅读模式
笔者公众号:技术杂学铺
笔者网站:mwhitelab.com
Emoji能传递信息?当然可以!本文,我们将探讨如何用Emoji来加密文本以及图片。
阅读全文预计约12分钟
段子:★★★
知识:★★★★
阅读本文你将学到:字符编码、密码学基础知识
<hr/>Emoji,即我们手机中常见的表情符号,最初起源于日本,是人们在网络社交中常用的形意符号。

Emoji在日语里叫“絵文字”,其中“絵”发音为e,表示图片,“文字”发音为moji,指字符。即emoji是日语“絵文字”的发音,emoji与英文单词emotion(情感)拼写相似纯属巧合。



自2010年以来,emoji表情符号一路走红,以至于哭笑脸( )被牛津词典列为2015年年度词汇。


Emoji可以传递信息,表达情感。但Emoji的能力不止于此。我们可以用emoji来加密信息



图片截取自电影《模仿游戏》

于是鄙人潜心研究emoji表情(3天),并创造出“Emoji密码学”Emoji密码学可分为四个不同等级的加密方法,下面鄙人将逐一介绍。
注:本文中出现的所有Emoji符号在不同的操作系统/浏览器中的显示可能会略有不同


Level1: 抽象法

在Emoji密码学中,最简单的加密方法为抽象学:即通过emoji符号的形状、近似发音来传达信息
比如“鸡飞蛋打”可以加密为:


“衣食父母”可以加密为


Emoji除了可以加密文本信息以外,我们还可以加密表情包、热点事件等等。

比如我们可以将下面的“真香”表情包


加密为:


再比如“我们中国真是太厉害了”,可以加密为:



当初的“腾讯老干妈”事件可以概括为(虽然该表情已经下架):


最近知乎上热议的某热点事件可以表示为:  


(温馨提示,使用Emoji抽象学时请注意文明用语)


Level2: 图像加密

我们可以通过Emoji的形状或近似发音来对文字进行了加密,那么有没有办法对图片加密呢?当然可以!用颜色
大部分的Emoji都是以一个颜色为主的,因此,我们可以预先设定几个Emoji,并给出其RGB属性:
值得注意的是同一个Emoji符号在不同操作系统上的显示可能会略有不同。这里,我们以Emoji在windows上的长相为例。


红心"❤️",我们设置其RGB属性为R232, G18 ,B36(R,G和B分别表示红色、绿色以及蓝色):


下面开始实战。比如说给出浑元形意太极门派掌门人马老师的照片:


我们遍历图片中的每个像素点,并找出与该像素点颜色最相近的Emoji符号。
(不了解编程的读者可忽略代码示例)


编码后的Emoji符号集合如下:


放大仔细看的话可以发现,其实上面的那张编码后的图片是由一连串Emoji符号组成的。


在上述步骤中,我们将图片加密成了Emoji符号,同理,我们也可以将Emoji符号解密成图片,解密后的图片如下:


由于某些细节问题,Emoji字符串解密回图片的算法较为复杂,此处略过,具体算法可见如下地址。本文中的所有算法均开源到:

http://github.com/DrMofu/MLab_wechat

欢迎会编程且感兴趣的读者欢迎前去标星、查看。
PS:除了对图片进行Emoji加密以外,我们甚至还可以对视频进行Emoji加密。视频加密的原理与图片相同,将视频中的每一帧分别进行本节中的图片加密即可。


Level3: 恺撒加密

下面,我们将结合基础的密码学知识来进行文本加密。最简单的便是运用恺撒加密
恺撒密码:我们将字母表往后偏移K位,用偏移后的字母来替代偏移前的字母
比如当K=3时,我们用字母“D”来替代原文中的字母“A”,用字母“E”来替代原文中的字母“B”……



恺撒密码示意图

给出一段明文“技术杂学铺的文章写得真好”,我们先将其转换成拼音"ji shu za xue pu de wen zhang xie de zhen hao"

(不了解编程的读者可忽略代码示例)


然后,我们可以根据恺撒密码的原理,编写一个函数,设置偏移值K=3,求出加密后的密码为"mlvkxc..."



解密的时候,我们只需要把偏移量设置成之前的相反数即可,即K=-3。


当然,把拼音还原成汉字就比较难了,即使用深度学习中自然语言领域出名的语言模型如Bert,GPT等也不一定能达到百分之百的准确性。

目前我们单纯地把问题简化成我们想加密的就是中文拼音,想解密出来的也是中文拼音
在了解了恺撒加密算法的原理后,我们即可通过融入Emoji的方式来传递加密信息
我们可以用不同的Emoji符号来替代不同的字母。Emoji符号与字母之间的Unicode编码都相差一个固定的值(第5节会讲到什么是Unicode),即我们可以将字母的Unicode编码往后位移K位来得到一个对应的Emoji符号,我们也可以把Emoji符号的Unicode编码往前位移K位来还原出加密前的字母


各个字母与Emoji符号的对应关系如下



Emoji摩尔斯加密示意图

于是"ji shu za xue pu de wen zhang xie de zhen hao"就加密为“                                  ” (部分用户可能会无法正常显示Emoji表情包。在windows平台上,加密后的Emoji前十位如下。)





Level4: 摩尔斯加密

对于摩尔斯密码(摩斯电码),常看谍战片或侦探推理小说的读者对此应该不陌生。


上图即为摩尔斯密码表,我们用短信号(·)和长信号(—)交替来表示某一个字符。
字符“A”可以表示为 短 长;字符“B”可以表示为 长 短 短 短……
在实现上,我们可以构建一个字典,加密的时候查字典即可。
(不了解编程的读者可忽略代码示例)


解密摩尔斯码的时候同理,查字典即可。


于是"ji shu za xue pu de wen zhang xie de zhen hao"可以加密为:“.--- .. ... .... ..- --.. .- -..- ..- . .--. ..- -.. . .-- . -. --.. .... .- -. --. -..- .. . -.. . --.. .... . -. .... .- ---
摩尔斯码有一点需要吐槽的是加密后不同字符的摩斯码一定要用空格分开,否则会出现混淆。如字符“A”的摩斯码是(短长),字符“E”的摩斯码是(短),字符“T”的摩斯码是(长)。若不在摩斯码中间添加空格,则“ET”的摩斯码(短长)则会和字符“A”的摩斯码一模一样!
摩尔斯密码加密后只有“·” 短和“—”长两种信号,那该如何用Emoji符号加密呢?

也许我们可以只选择两个Emoji符号,其中一个Emoji符号代表短信号,另一个Emoji符号表示长信号?就像下图这样,黑月亮代表“—”,黄月亮代表“·”:


不不不,这样图样图森破了。


自Unicode8.0开始,Emoji有一个神奇的特点,那就是肤色
各种肤色的Emoji:              
部分读者可能无法正常显示上面的emoji表情,图片示意图如下(不同操作系统上,Emoji符号的样子可能会不同):


Unicode中专门设置了肤色编码,这样,我们制定一个人脸,再制定一个肤色,就可以创造出各种各样的Emoji符号:


此时我们用白色的皮肤来表示摩斯加密后的短信号“·” ,用黑色的皮肤表示加密后的长信号“—”,用黄色的皮肤来分隔摩尔斯码。


于是,待加密信息“晚8点老地方”先转换成拼音“wan 8 dian lao di fang”,再转换成摩尔斯密码'.-- .- -. ---.. -.. .. .- -. .-.. .- --- -.. .. ..-. .- -. --.',此时,我们用白皮肤Emoji替代短信号“·”,黄皮肤Emoji替代空格,黑皮肤Emoji提拍长信号“—”,而Emoji具体长什么样则随机。加密后的Emoji符号可能长这样:


再次强调一下,本加密方法真正重要的信息储存在Emoji符号的肤色中,而人物的长相只是障眼法。同样是“wan 8 dian lao di fang”,加密后的前十位可能是:


也可能是(注意,肤色是一样的):


于是,那些在研究不同形状的Emoji代表什么意思的密码破解者,肯定想不到其实Emoji形状不传递信息,肤色才传递
将Emoji符号解密回拼音的方法如下:


PS:其实我们还可以在不同肤色的Emoji之间再随机掺杂一些其他没有肤色信息的Emoji符号。这些Emoji符号不表示任何信息,在解密时这些无关的Emoji符号会被忽视掉。虽然对传递信息没有帮助,但这些Emoji符号会起到迷糊旁观者的作用,让其更加难以发现其实只有有肤色的Emoji符号传递有用的信息




附加内容:Emoji实现原理



在“瞎闹”后,让我们学一点有用的知识。
你有没有想过,你正在看的这篇文章在你的手机/电脑眼中是什么样的?
比如一个字符“人”,在我们眼中其是由一撇一捺组成的,但在计算机眼中,其是由一串二进制数来表示的。
那如何定义是哪个二进制数来对应字符“人”呢?定义的规则有很多,比如国内常用的“GBK”编码,台湾用的“BIG5”编码规则。不同的规则中字符“人”所对应的二进制数都不一样,这就使得采用不同编码规则的用户之间传输数据十分麻烦。



字符“人”在两套不同的编码规则中的编码不同

在指定某个字符对应某一串二进制数字上,目前国际上公认的是Unicode(中文又称万国码、国际码)。Unicode是一个字符集其给我们日常生活中会用到的每一个字符(从英文到汉字、从数学符号到小图案)都分配一个唯一的ID
在Unicode规则中,字符“人”是第20154个字符(10进制),对应的16进制编号为U+4eba(16进制,U+表示这是Unicode编号)
于是,在计算机相互沟通时,计算机可以统一采用Unicode编码方式表示字符。
额外细节:虽然我们在上文中说“Unicode编码”,读者也会在各类其他文章中看到“Unicode编码”这个说法,但实际上,Unicode只是字符集,其只定义了每个字符对应的ID,在实际网络传输中,我们常常要将Unicode转换为UTF-8编码来传输数据。转换关系如下:


对英文用户来说,每个英文字符的UTF-8编码只占1个字节,但是对中文用户来说,每个中文字符在UTF-8格式中则需要3个字节来表示!
因此,对于国内用户来说,我们的windows电脑的默认文本编码格式仍旧是GBK格式,因为一个汉字在GBK格式中只占2个字节,相比于UTF-8格式的3个字节,会省下很多空间。
下面,我们再回来谈谈Emoji。Emoji实际上是可编码字符,即Emoji是字符。

既然是字符,那也可以用Unicode来表示(当然,前提是有定义。)
成功显示一个Emoji字符有两个必要条件:


  • 该Emoji字符在Unicode中有定义
  • 查看该Emoji字符的终端(手机/电脑)支持显示该Unicode字符。
你可以在微信中给别人发一个图片表情包,但该表情包不能以一个字符的形式存在,因为其在Unicode中没有定义。



对于Unicode中已经定义的Emoji表情:米饭 对应的Unicode编码是U+1f35a,鸡飞蛋打 “ ✈️  ”对应的Unicode编码为U+1f414 U+2708 U+1f95a U+1f528


当我们在输入法中输入emoji符号时,实际上输入的是上述的一串串编码。我们发送米饭Emoji 时,手机/电脑实际发出的是第U+1f35a编号的Unicode所对应的UTF-8编码“\xf0 \x9f \x8d \x9a”,对方接收到“\xf0 \x9f \x8d \x9a”后,对方的手机/电脑将其转换成米饭Emoji 。

也正是如此,我们可以轻松地在微信等社交软件上


对了,最近微信更新的六个Emoji表情不是Unicode字符。


你如果在未更新的微信端查看这些Emoji的话,你实际看到的是一串文字


有一点值得注意的是,在本文中所展示的Emoji符号绝大部分是由图片来表示的。这是因为同一个Emoji符号,在不同软件的显示不同。有的软件甚至可能不支持某些Emoji符号
比如米饭Emoji 对应的Unicode编码为U+1f35a,但不同的通讯软件、浏览器对U+1f35a显示出的符号可能会完全不同
根据网站http://emojipedia.org/cooked-rice/ 上提供的数据,我们会发现:同样是米饭emoji ,苹果(ios系统),google(安装系统)和三星(三星手机的One UI)所展示出来的符号完全不一样。


Unicode的最新14.0版本中总共定义了超14万种不同的字符。如此多的字符,操作系统不可能全部都有对应的显示,对于显示不了的字体,系统多以白框来表示。


Unicode发展至今,以及十分完备了,基本上全世界日常生活上会用的字符都已经被定义在Unciode之中了,甚至于“biang biang 面”里面的biang都包括在其中。当然,unicode中有定义是一回事,你的手机/电脑支不支持显示就是另一回事了。



本文中的代码已上传至:
github.com/DrMofu/MLab_wechat
参考资料


  • Emoji历史:http://en.wikipedia.org/wiki/Emoji
  • Emoji搜索网站:http://emojipedia.org
  • Unicode查询:http://www.branah.com/unicode-converter
  • 阮一峰:字符编码笔记:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
  • Unicode百科:http://baike.baidu.com/item/Unicode/750500
  • Unicode 和 UTF-8 有什么区别?:
    http://www.zhihu.com/question/23374078/answer/69732605
  • 程序员趣味读物:谈谈Unicode编码:
    http://pcedu.pconline.com.cn/empolder/gj/other/0505/616631_all.html
  • Unicode官网:http://home.unicode.org
推荐阅读

如果你觉得本篇文章比较有意思,欢迎关注技术杂学铺公众号点赞分享本文章。



文章第一时间在公众号内更新
回复

使用道具 举报

1

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-11-30 11:53:49 | 显示全部楼层
不要误导大家,让大家以为密码学和这个有关系。
回复

使用道具 举报

1

主题

8

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2022-11-30 11:54:00 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋| 黑客通

GMT+8, 2025-4-7 07:35 , Processed in 0.085629 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2020, LianLian.

快速回复 返回顶部 返回列表