仓库源文站点原文


title: 使用零宽字符实现文本隐藏加密 toc: true cover: 'https://img.paulzzh.com/touhou/random?95' date: 2020-09-29 11:12:50 categories: 技术杂谈 tags: [技术杂谈, 零宽字符, 文字隐藏]

description: 零宽字符是一种在浏览器中不打印的字符,大致相当于display-none,在许多文本应用中也不显示,比如邮箱、QQ、微信、文本编辑器等;本文讲解了如何使用零宽字符实现文本隐藏和加密;

零宽字符是一种在浏览器中不打印的字符,大致相当于display-none,在许多文本应用中也不显示,比如邮箱、QQ、微信、文本编辑器等;

本文讲解了如何使用零宽字符实现文本隐藏和加密;

<br/>

<!--more-->

使用零宽字符实现文本隐藏加密

什么是零宽字体

零宽字符是一种在浏览器中不打印的字符,大致相当于 display: none,在许多文本应用中也不显示,比如邮箱、QQ、微信、文本编辑器等;

这里有三种零宽字符 -- 零宽空格、零宽连字、零宽不连字

零宽字符在浏览器中对应的转义字符:

零宽空格    --- &#8203;  
零宽不连字  --- &#8204;
零宽连字    --- &#8205;
<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  ->   --/---/.-./.../.

现在我们再将 / 替换为零宽空格; - 替换问零宽连字;. 替换为零宽不连字

/   -->    &#8203;
.   -->    &#8204;
-   -->    &#8205;

那么就能将morse这个单词转换为如下零宽字符

&#8205;&#8205;&#8203;&#8205;&#8205;&#8205;&#8203;&#8204;&#8205;&#8204;&#8203;&#8204;&#8204;&#8204;&#8203;&#8204;

将这段零宽字符粘贴进一个HTML文件当中

<p>前</p>
<div>&#8205;&#8205;&#8203;&#8205;&#8205;&#8205;&#8203;&#8204;&#8205;&#8204;&#8203;&#8204;&#8204;&#8204;&#8203;&#8204;</div>
<p>后</p>

在浏览器中打开这个HTML文件,你只能看到 "前后" 两个字!

到这,使用零宽字符实现文本隐藏加密的原理已经可见一斑了!

<BR/>

中文字符加密支持

到这里我们已经实现对普通字符串的加密了,但是只支持英文和数字!

如果你想支持中文加密,也是有解决方案的!

要实现中文加解密,主要思路是先对文本进行正则匹配,将其中的中文进行Unicode转码,转码后整段文本就变成了:字母、数字、\ 的组合,我们在加解密字典中加上对 \ 的支持,即可!

<br/>

加密使用方式

注意:

  1. pc版QQ不支持零宽字符,会显示空格,但手机版不会;
  2. 中文转码长度大约是相同长度英文字符的6倍;
  3. 零宽字符虽然看不见但是,但也是一个个字符,所以删除含有零宽字符的文本时,删到零宽字符时会删不动要把零宽字符全部删完才能接着往下删;

在线地址:

上面的网站都可以实现零宽字符加密,大家不妨可以试试!

<br/>

应用场景

① 存储隐藏信息

零宽字体可以用来存储隐藏信息, 比如:隐藏加密存储比特币钱包,或者在你的代码里埋下一个彩蛋:


② 秘密传达消息

零宽字符在大部分应用都支持,pc版QQ会显示零宽字符,但移动端不显示;

你可以将密文加密到普通文本中,然后邮件发送,表面上看起来是普通文本,只有对方复制明文进行解密后才能看出隐藏信息!


③ 为文章添加隐藏水印

你可以在你写的文章插入隐藏字符,将作者信息嵌入其中;

当别人复制你的文章时,并不会发现这篇文章已经被你悄悄打下水印;

<br/>

在写代码时的坑

零宽字体通常是不可见的,所以在写代码的时候,如果在代码中加入了这些零宽字符,是非常坑的!

所以在打印日志的时候,推荐使用:fmt.Printf("%#v", info)来打印日志!

<br/>

附录

参考文章:

<br/>