序
网上冲浪发现的好玩的加密方式,但是有的使用的是摩斯密码之类的。(中文会翻好几倍长度)
然后我发现零宽字符够16种,所以尝试使用16进制来加密。(中文一般长度 * 2就够了)
- 零宽字符是一种没有长度的字符,实际作用可以进行百度。
- 16进制一共16种不一样的字符,正常为以下16种。
0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
加密阶段
原理
一个汉字先转换成 字节类型 ,然后转换成 16进制数 ,此时一个汉字一般对应2个字符(就是2个16进制数)
此时我们进行把每个 16进制字符 替换成对应的 零宽字符 就完成了加密。
操作
首先先搞出对应的字典。
a = {
'0': '',
'1': '',
'2': '',
'3': '',
'4': '',
'5': '',
'6': '',
'7': '',
'8': '',
'9': '',
'a': '',
'b': '',
'c': '',
'd': '',
'e': '',
'f': ''
}
使用 .encode('utf-8').hex() 进行字符串转16进制。
b = '你好世界'
c = b.encode('utf-8').hex()
然后进行依次替换。
for i in c:
d += a[i]
最后输出就好。
print(f'密{d}文')
解密阶段
同样还是那个字典。
a = {
'0': '',
'1': '',
'2': '',
'3': '',
'4': '',
'5': '',
'6': '',
'7': '',
'8': '',
'9': '',
'a': '',
'b': '',
'c': '',
'd': '',
'e': '',
'f': ''
}
只不过这回我们要用到这个字典的反对应字典。
我用的笨方法调转的字典对应关系。
c = {}
for i, j in a.items():
c[j] = i
然后我们需要对输入的解密的字符串进行取值,将全部的零宽字符提取出来。
import re
b = input('输入密文:')
d = re.sub('[^\u200b-\u200f\uFEFF\u202a-\u202e\u206a-\u206f]', '', b)
然后将零宽字符转成16进制。
for i in d:
e += c[i]
最后将16进制转成字符串就大功告成了!
f = bytes.fromhex(e).decode('utf-8')
print(f)