简而言之,就是字节宽度为0的特殊字符.
零宽度字符是一些不可见的,不可打印的字符。它们存在于页面中主要用于调整字符的显示格式。
下面就是一些常见的零宽度字符及它们的unicode码和原本用途:
1.零宽度空格符 (zero-width space) U+200B : 用于较长单词的换行分隔
2.零宽度非断空格符 (zero width no-break space) U+FEFF : 用于阻止特定位置的换行分隔
3.零宽度连字符 (zero-width joiner) U+200D : 用于阿拉伯文与印度语系等文字中,使不会发生连字的字符间产生连字效果
4.零宽度断字符 (zero-width non-joiner) U+200C : 用于阿拉伯文,德文,印度语系等文字中,阻止会发生连字的字符间的连字效果
5.左至右符 (left-to-right mark) U+200E : 用于在混合文字方向的多种语言文本中(例:混合左至右书写的英语与右至左书写的希伯来语),规定排版文字书写方向为左至右
6.右至左符 (right-to-left mark) U+200F : 用于在混合文字方向的多种语言文本中,规定排版文字书写方向为右至左
实现原理
首先,输入需要被加密的内容将被转换为其二进制形式,然后该二进制将被转换为一系列表示每个二进制数字的零宽度字符。然后可以将零宽度的字符串不可见地插入正常文本中。如果将文本粘贴在其他地方,则可以提取零宽度的字符串,然后反向进行操作以找出被加密的内容
具体解释
具体加密过程:
1.将需加密的内容转换为二进制
只是将每个字符转换为其等效的二进制
const zeroPad = num => ‘00000000’.slice(String(num).length) + num;
const textToBinary = username => (
username.split('').map(char =>
zeroPad(char.charCodeAt(0).toString(2))).join(' ')
);
2.将二进制转换为0宽字符
它将遍历二进制字符串,并将每个1转换为0宽度空间,将每个0转换为零宽非连接符。
转换字母后,我们将插入0宽连接符,然后再下一个。
const binaryToZeroWidth = binary => (
binary.split('').map((binaryNum) => {
const num = parseInt(binaryNum, 10);
if (num === 1) {
return ''; // zero-width space
} else if (num === 0) {
return ''; // zero-width non-joiner
}
return ''; // zero-width joiner
}).join('') // zero-width no-break space
);
3.插入正常文本中
需要注意的是加密与解密所使用的字典必须一致,也就是说,在哪儿进行加密的,就要在哪儿解密。
解密过程就是加密过程的反逻辑
零宽度字节在网页中不会被显示
例题
[UTCTF2020]zero
题目zero暗示了零宽度字符加密
网上寻找在线解密网站零宽度字符加密解密网站