零宽度字符加密


​​ 简而言之,就是字节宽度为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.插入正常文本中
需要注意的是加密与解密所使用的字典必须一致,也就是说,在哪儿进行加密的,就要在哪儿解密。
解密过程就是加密过程的反逻辑
75afb321ef37e106885294380f81a016.png
零宽度字节在网页中不会被显示

例题

[UTCTF2020]zero
题目zero暗示了零宽度字符加密
网上寻找在线解密网站零宽度字符加密解密网站


文章作者: lijunliang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 lijunliang !
评论
 上一篇
基于Django3.0的web框架详细架构过程(一) 基于Django3.0的web框架详细架构过程(一)
参考书籍《python编程:从入门到实践》十八章,十九章,二十章内容,该书籍Django使用1.11版本,而如今Django已经更新到3.0+,因此本文将进行两种版本的对比并且匹配版本更迭导致的代码报错问题,一步一步带你实现适用Django3.0版本的web框架。
2021-03-12
下一篇 
  目录