title: 使用零宽字符实现文本隐藏加密 toc: true cover: 'https://img.paulzzh.com/touhou/random?95' date: 2020-09-29 11:12:50 categories: 技术杂谈 tags: [技术杂谈, 零宽字符, 文字隐藏]
零宽字符是一种在浏览器中不打印的字符,大致相当于display-none,在许多文本应用中也不显示,比如邮箱、QQ、微信、文本编辑器等;
本文讲解了如何使用零宽字符实现文本隐藏和加密;
<br/>
<!--more-->零宽字符是一种在浏览器中不打印的字符,大致相当于 display: none
,在许多文本应用中也不显示,比如邮箱、QQ、微信、文本编辑器等;
这里有三种零宽字符 -- 零宽空格、零宽连字、零宽不连字
零宽字符在浏览器中对应的转义字符:
零宽空格 --- ​
零宽不连字 --- ‌
零宽连字 --- ‍
<BR/>
对于零宽字体的加密可以使用摩斯密码:
摩斯电码采用长短两种符号进行文本加密,通过字典进行加密和解码,摩斯电码字典如下所示:
字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 | 字符 | 代码 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A | ·- |
B | -··· |
C | -·-· |
D | -·· |
E | · |
F | ··-· |
G | --· |
H | ···· |
I | ·· |
J | ·--- |
K | -·- |
L | ·-·· |
M | -- |
N | -· |
O | --- |
P | ·--· |
Q | --·- |
R | ·-· |
S | ··· |
T | - |
U | ··- |
V | ···- |
W | ·-- |
X | -··- |
Y | -·-- |
Z | --·· |
如果我们使用/
作为分隔符,则将 morse
这个单词转换为摩斯电码就是:
morse -> --/---/.-./.../.
现在我们再将 /
替换为零宽空格; -
替换问零宽连字;.
替换为零宽不连字
/ --> ​
. --> ‌
- --> ‍
那么就能将morse这个单词转换为如下零宽字符
‍‍​‍‍‍​‌‍‌​‌‌‌​‌
将这段零宽字符粘贴进一个HTML文件当中
<p>前</p>
<div>‍‍​‍‍‍​‌‍‌​‌‌‌​‌</div>
<p>后</p>
在浏览器中打开这个HTML文件,你只能看到 "前后"
两个字!
到这,使用零宽字符实现文本隐藏加密的原理已经可见一斑了!
<BR/>到这里我们已经实现对普通字符串的加密了,但是只支持英文和数字!
如果你想支持中文加密,也是有解决方案的!
要实现中文加解密,主要思路是先对文本进行正则匹配,将其中的中文进行Unicode转码,转码后整段文本就变成了:字母、数字、\
的组合,我们在加解密字典中加上对 \
的支持,即可!
<br/>
注意:
在线地址:
上面的网站都可以实现零宽字符加密,大家不妨可以试试!
<br/>
零宽字体可以用来存储隐藏信息, 比如:隐藏加密存储比特币钱包,或者在你的代码里埋下一个彩蛋:
零宽字符在大部分应用都支持,pc版QQ会显示零宽字符,但移动端不显示;
你可以将密文加密到普通文本中,然后邮件发送,表面上看起来是普通文本,只有对方复制明文进行解密后才能看出隐藏信息!
你可以在你写的文章插入隐藏字符,将作者信息嵌入其中;
当别人复制你的文章时,并不会发现这篇文章已经被你悄悄打下水印;
<br/>
零宽字体通常是不可见的,所以在写代码的时候,如果在代码中加入了这些零宽字符,是非常坑的!
所以在打印日志的时候,推荐使用:fmt.Printf("%#v", info)
来打印日志!
<br/>
参考文章:
<br/>