编码&密码篇
推荐https://www.dcode.fr/和CyberChef
常见编码
1.1. ASCII编码
ASCII码大致可以分作三部分组成。
第一部分是:ASCII非打印控制字符。ASCII表上的数字0–31分配给了控制字符,用于控制像打印机等一些外围设备。
第二部分是:ASCII打印字符。数字 32–126 分配给了能在键盘上找到的字符,数字127代表 DELETE 命令。
第三部分是:扩展ASCII打印字符。扩展的ASCII字符满足了对更多字符的需求。扩展的ASCII包含ASCII中已有的128个字符(数字0–32显示在下图中),又增加了128个字符,总共是256个。
1.2. Base家族
base64 编码是用64(2^6)个字符,对二进制数据进行编码的方式
base32 就是用32(2^5)个字符,对二进制数据进行编码的方式
base16 就是用16(2^4)个字符,对二进制数据进行编码的方式
这里我们可以清楚的看到,base系列编码之间的不同,在于用于编码的字符数量的多少
具体参考wiki百科
1.2.1. base16码表
0123456789ABCDEF
Base16使用两个ASCII字符去编码原数据中的一个字节数据,所以Base16不可能用到填充符号=
1.2.2. base32码表
ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
另有=
符号作为填充
1.2.3. base58码表
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
相比 Base_64,Base_58 不使用数字 “0”,字母大写”O”,字母大写 “I”,和字母小写 “l”,以及 “+” 和 “/“ 符号,比Base64共减少6个字符,故称着Base58
1.2.4. base62码表
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
Base62使用了62个字符编码,包括0-9,a-z,A-Z。
1.2.5. base64码表
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
另有=
符号作为填充
1.2.6. base91码表
Base91编码是从94个可打印ASCII字符(0x21-0x7E)中,以下三个字符被省略以构建Base91编码表:-(破折号,0x2D)\(反斜杠,0x5C)’(撇号,0x27)
1.3. Quoted-printable 编码
Quoted-printable或QP encoding,没有规范的中文译名,可译为可打印字符引用编码或使用可打印字符的编码。Quoted-printable是使用可打印的ASCII字符(如字母、数字与“=”)表示各种编码格式下的字符,以便能在7-bit数据通路上传输8-bit数据, 或者更一般地说在非8-bit clean媒体上正确处理数据。这被定义为MIME content transfer encoding,用于e-mail。
例子:=E4=BB=8A=E5=B9=B4=E5=85=83=E5=A4=9C=E6=97=B6=EF=BC=8C=E6=9C=88=E4=B8=8E=E7=81=AF=E4=BE=9D=E6=97=A7=E3=80=82
特点:由=
,大写字母A–F
和数字0-9
组成,不加密英文和数字
在线加解密
1.4. XXencode编码
表:+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
XXencode将输入文本以每三个字节为单位进行编码。如果最后剩下的资料少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6bit为单位分为4个组,每个组以十进制来表示所出现的数值只会落在0到63之间。以所对应值的位置字符代替。
例子:
1 2 3 4 5
| hK3VZPaBjN4KxewfYmCjCl94yohH1jwXxiDPLpfrOneepdQuvjTXEo95UkiiV hcwXbiTjLvffnmeDDkfL2pwf-nwbNoxf6zPXqpxOxqeCggfitivL2gfyrrRD1 hkSCmiQPfcODJsgXxiDPLpfrOiP9Ho16oiDN0OLGXfB9IBa7dRAuehOLCivTK hnecoiDPLuOCgkvysxhTdohH8ffrspgP+h95hmfv9yPDqnxOplAfxpfLKivjV dkiHIqX0pjHMnpeuwt84XohH9yPPIouPKhPL2nfjKkxTKhzioygnacOA+
|
特点:第一位通常表示这一行密文是由多少个字符加密得到的,比如cat
加密后是1Mq3o
,1
在表中的索引值是3,所以可以看做原文由三位字符组成。并且每行最多只能加密45
个字符,然后换行,可以参考上面的例子
在线加解密
1.5. UUencode编码
表:ASCII字符集中可打印字符(32-96)
UUencode是一种二进制到文字的编码,最早在unix 邮件系统中使用,全称:Unix-to-Unix encoding,UUencode将输入文本以每三个字节为单位进行编码,如果最后剩下的资料少于三个字节,不够的部份用零补齐。三个字节共有24个Bit,以6-bit为单位分为4个组,每个组以十进制来表示所出现的字节的数值。这个数值只会落在0到63之间。然后将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中。
例子:
1 2 3 4 5 6 7 8 9
| M555E;F-O9&7*Q]*[UM:V_KWXUL:UO<[$U]:UQ+'@PNNCK-?NU.?4VG5N:7@@ MT\J\_L^US;/6T,JYT\.CK,BKL\:CNE5N:7@M=&\M56YI>"!E;F-O9&EN9Z.L M555E;F-O9&6]J\KDR.O.Q+&^TM3#O\C]N/;7UKW:SJJUI<Z[O?C0T+'@PNNC MK,CGN?O7[KKSRJ//PK7$U\K!S\G9T]K(_;CVU]:]VJ.LLKNYN[7$LK^WW=/# MP>.RN<;KH:/(_;CVU]:]VKFRT]`R-+CV0FETHZS2U#8M8FETSJJUI<Z[M];. MJC2X]M?IHZS#O[CVU^G2U,JNO?C6QL"TL>W*OLOYL_;/UK7$U]:]VK7$ROW6 MM:&CU>*X]LK]UK76N[OAPN34VC"UO38SUJZ\Y*&CR+NZ\[VKP[^X]LK]O-/) MSS,RHZS+^;+ZR?JUQ+WAN?NXU;K#PN34VD%30TE)U]:W^[ROUM"_R;3RTZ'7 CUK?[HZ@S,BV_U;#7H:TY-2VUU\_?HZFUQ+>VSJ?6KM;0H:,`
|
特点:与XXencode相似,第一位表示这一行密文是由多少个字符加密得到的。
在线加解密
1.6. 敲击码
基于5×5方格波利比奥斯方阵来实现
例子:..... ../... ./... ./... ../
原文:wllm
特点:不超过五个点,两个一组
1.7. 莫尔斯电码
摩尔斯电码主要由以下5种它的代码组成:
1:点(.)
2:划(-)
3:每个字符间短的停顿(通常用空格表示停顿)
4:每个词之间中等的停顿(通常用 / 划分)
5:以及句子之间长的停顿
表
1 2 3 4 5 6 7 8 9 10 11 12 13
| .- -. . .-.-.- + .-.-. .---- -... --- , --..-- ..--.- ..--- -.-. .--. ---... ...-..- ...-- -.. --.- .-..-. .-... ....- . .-. .----. -..-. ..... ..-. ... -.-.-- -.... --. - ..--.. --... .... ..- .--.-. ---.. .. ...- - -....- ----. .--- .-- -.-.-. ----- -.- -..- -.--. .-.. -.-- -.--.- -- --.. -...-
|
例子:.../---/...
原文:SOS
在线解密
1.8. 社会主义核心价值观编码
github上的加解密js代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
| import "babel-polyfill"; { function assert(...express){ const l = express.length; const msg = (typeof express[l-1] === 'string')? express[l-1]: 'Assert Error'; for(let b of express){ if(!b){ throw new Error(msg); } } }
function randBin(){ return Math.random() >= 0.5; }
const values = '富强民主文明和谐自由平等公正法治爱国敬业诚信友善';
function str2utf8(str){
const notEncoded = /[A-Za-z0-9\-\_\.\!\~\*\'\(\)]/g; const str1 = str.replace(notEncoded, c=>c.codePointAt(0).toString(16)); let str2 = encodeURIComponent(str1); const concated = str2.replace(/%/g, '').toUpperCase(); return concated; }
function utf82str(utfs){ assert(typeof utfs === 'string', 'utfs Error');
const l = utfs.length;
assert((l & 1) === 0);
const splited = [];
for(let i = 0; i < l; i++){ if((i & 1) === 0){ splited.push('%'); } splited.push(utfs[i]); }
return decodeURIComponent(splited.join('')); }
function hex2duo(hexs){
assert(typeof hexs === 'string')
const duo = [];
for(let c of hexs){ const n = Number.parseInt(c, 16); if(n < 10){ duo.push(n); }else{ if(randBin()){ duo.push(10); duo.push(n - 10); }else{ duo.push(11); duo.push(n - 6); } } } return duo; }
function duo2hex(duo){ assert(duo instanceof Array);
const hex = [];
const l = duo.length;
let i = 0;
while(i < l){ if(duo[i] < 10){ hex.push(duo[i]); }else{ if(duo[i] === 10){ i++; hex.push(duo[i] + 10); }else{ i++; hex.push(duo[i] + 6); } } i++; } return hex.map(v=>v.toString(16).toUpperCase()).join(''); }
function duo2values(duo){ return duo.map(d=>values[2*d]+values[2*d+1]).join(''); }
function valuesDecode(encoded){ const duo = [];
for(let c of encoded){ const i = values.indexOf(c); if(i === -1){ continue; }else if(i & 1){ continue; }else{ duo.push(i >> 1); } }
const hexs = duo2hex(duo);
assert((hexs.length & 1) === 0);
let str; try{ str = utf82str(hexs); }catch(e){ throw e; } return str; }
function valuesEncode(str){ return duo2values(hex2duo(str2utf8(str))); }
const decodedArea = document.getElementById('decoded-area'); const encodedArea = document.getElementById('encoded-area'); const decodeBtn = document.getElementById('decode-btn'); const encodeBtn = document.getElementById('encode-btn');
encodeBtn.addEventListener('click', e=>{ encodedArea.value = ''; const encoded = valuesEncode(decodedArea.value); encodedArea.value = encoded; });
decodeBtn.addEventListener('click', e=>{ decodedArea.value = ''; const decoded = valuesDecode(encodedArea.value); decodedArea.value = decoded; }); };
|
分析后不难发现有以下几点结论:
1:表是富强 民主 文明 和谐 自由 平等 公正 法治 爱国 敬业 诚信 友善
,索引值0-11
2:字符串hex值中的0-9 对应 表索引值的0-9。比如十六进制的0,在表中是富强
3:字符串hex值中的A-F 对应 表索引值的关系有两种
1 2 3 4 5 6 7 8 9 10 11 12 13
| A -> 10 0 B -> 10 1 C -> 10 2 D -> 10 3 E -> 10 4 F -> 10 5
A -> 11 4 B -> 11 5 C -> 11 6 D -> 11 7 E -> 11 8 F -> 11 9
|
解释一下上面的结论,以我Kc !6
为例子
加密后的几种结果为
诚信自由公正爱国爱国敬业民主自由诚信民主公正和谐文明富强文明民主和谐公正
诚信自由公正爱国爱国敬业民主自由友善平等公正和谐文明富强文明民主和谐公正
友善爱国公正爱国爱国敬业民主自由诚信民主公正和谐文明富强文明民主和谐公正
友善爱国公正爱国爱国敬业民主自由友善平等公正和谐文明富强文明民主和谐公正
先将我Kc !6
以十六进制编码的形式表示E6 88 91 4B 63 20 21 36
E
在表中是10 4
或者11 8
,然后拿10 4
和11 8
在索引表中找到诚信 自由
或者友善 爱国
,再接着是6
,在表中是公正
,后面的以此类推。
1.9. jjencode/aaencode
jjencode代码,就是将正常的js代码转换成复杂的只有符号的字符串编码,进行加密 如:[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$
这样的组合
aaencode代码,则是将正常的js代码转为好玩的特殊网络表情符号。如:゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚)
这样的表情文字
AAEncode加密/解密
jjencode与aaencode解密
1.10. 熊曰/新佛曰/佛曰
例子:熊曰:呋食食和覺嗷嚁我麼啽咬盜噔哞噤
,新佛曰:殿諸殿隸僧降吽殿諸殿陀摩隸僧殿缽薩願殿耨殿諸囉愍殿慧願殿喼降眾殿薩隸殿婆殿亦殿如囑
,佛曰:訶諳僧涅諳波夜殿諸寫夷遮伽缽夢怯是參老倒智哆死得冥以哆心夢呐謹侄朋俱咒遮諳夜摩吉多罰實等
特点:这几种编码类似,都是以XX曰:
开头,后面各种繁体字和生僻字
在线 与熊论道/熊曰
在线 新约佛论禅
在线 与佛论禅
1.11. hex编码
原理:编码时,将8位二进制码重新分组成两个4位的字节(8位=1字节,其中一个字节的低4位是原字节的高4位,另一个字节的低4位是原字节的低4位,其他都补0,然后输出这两个字节对应十六进制数字作为编码。
1 2 3 4 5
| ASCII码: A (65) 二进制码:0100_0001 重新分组:0000_0100 0000_0001 十六进制: 4 1 Hex编码:41
|
结果:Hex编码后的长度是源数据的2倍
特点:0-9,A-F
1.12. html编码
在HTML文件中,是HTML编写过程中使用特殊的编码字符来进行网页页面的正确显示,是网页上面的一种编码格式。
例子:&的html实体编码是&
特点:以&
开头,以;
结尾
html实体编码手册
1.13. 中文电码
中文电码表采用了四位阿拉伯数字作代号,从0001到9999按四位数顺序排列,用四位数字表示最多一万个汉字、字母和符号。汉字先按部首,后按笔划排列。字母和符号放到电码表的最尾。
例子:
中:0022
文:2429
电:7193
码:4316
特点:四个数字一组
在线查询中文电码
1.14. 凯撒密码
古典密码,单表,加密可逆
1.15. 音符
加密后变成一串音符
例子:¶♯♬♪♫♭♬¶♩♫♬♪♩♩♬¶♬¶♯=
特点:全部由音乐符号组成
在线加解密
1.16. 盲文
布莱尔创造的由6个点为基础结构的盲字,在纸面上有的凸起,有的不凸起,形成64种变化,即64种符形,在每个符号(单位称”方”)左右两列,每列各三个点,从左边自上而下叫做1、2、3点,从右边自上而下叫做4、5、6点。
在线翻译1
在线翻译2
英语字母盲文表如下
数字盲文表如下
1.17. ook
Ook! 与Brainfuck类似, 但用单词”Ook”,”Ook.” 和 “Ook?”代替。
在线网站1
在线网站2
1.18. 波利比奥斯方阵密码
1.19. serpent
对称密钥块密码
在线加解密
1.20. piet
用位图色块来编写程序
本地命令:npiet.exe -q a.png
在线解释器
特点:颜色丰富的图片
1.21. 当铺密码
当前汉字有多少笔画出头,对应的明文就是数字几
例子:
1 2
| 密文:王夫 井工 夫口 由中人 井中 夫夫 由中大 对应:67 84 70 123 82 77 125
|
1.22. brainfuck
Brainfuck是一种极小化的计算机语言,只使用8种特定的符号
注意内存中也可能会藏有信息,例如2023年羊城杯的GIFuck
在线转换1,在线转换2
例子:
1 2 3
| +++++ +++++ [->++ +++++ +++<] >++++ ++++. ----- --.<+ +++[- >++++ <]>++ .<+++ [->-- -<]>- ----. <+++[ ->+++ <]>+. <+++[ ->--- <]>-- ---.< +++[- >+++< ]>+++ +.--- ----- -..<
|
1.23. BubbleBabble编码
特征:五位小写字母一组,以-
分割
例子:xipak-herek-serid-bapok-horek-syrox
在线工具
1.24. 阴阳怪气编码
特征:['就 这 ¿ ', '不 会 吧 ? ']
GitHub项目地址
在线编码解密
1.25. emoji or emoji-aes
特征:都由表情符号组成
emoji-aes实际上就是aes加密文本,用一个key当作偏移,在表情字典中对应
emoji在线
emoji-aes在线
1.26 codemoji
特征是key和密文为表情符号
codemoji-encrypt
codemoji-cracker
1.27 solfa-cipher
音乐密码
solfa-cipher
1.28 Code Decabit
特征:由+
和-
组成,十位一组
例如:
1
| +-+-++--+- ++---+-++- -+--++-++- +--++-++-- --+++++--- ++-++---+- +++-+-+--- +-+-+---++ ---+++-++- -+--++-++- -+--+++-+- -+--++-++- -+--++-++- ++-+-+-+-- -+--+++-+- ++-++---+- -++++---+- -+--++-++- ++-+-+-+-- +-+++---+- +++-++---- ---+++-++- +-+-+---++ ++-+-+-+-- +-+-+--++- ++--+--++- -++++---+- +---+++-+- ++-+-+-+-- -++++---+- -+--+++-+- +--+-+-++- +++-+-+--- +-+++---+- -+--+-+++- -+--++-++- ---+++-++- ++++----+- -++++---+- -+--+++-+- -+--++-++- ----+++++-
|
Code Decabit
1.29 DNA编码
特征:由ACGT
组成
加解密脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| mapping = {
'AAA':'a', 'AAC':'b', 'AAG':'c', 'AAT':'d', 'ACA':'e', 'ACC':'f', 'ACG':'g', 'ACT':'h', 'AGA':'i', 'AGC':'j', 'AGG':'k', 'AGT':'l', 'ATA':'m', 'ATC':'n', 'ATG':'o', 'ATT':'p', 'CAA':'q', 'CAC':'r', 'CAG':'s', 'CAT':'t', 'CCA':'u', 'CCC':'v', 'CCG':'w', 'CCT':'x', 'CGA':'y', 'CGC':'z', 'CGG':'A', 'CGT':'B', 'CTA':'C', 'CTC':'D', 'CTG':'E', 'CTT':'F', 'GAA':'G', 'GAC':'H', 'GAG':'I', 'GAT':'J', 'GCA':'K', 'GCC':'L', 'GCG':'M', 'GCT':'N', 'GGA':'O', 'GGC':'P', 'GGG':'Q', 'GGT':'R', 'GTA':'S', 'GTC':'T', 'GTG':'U', 'GTT':'V', 'TAA':'W', 'TAC':'X', 'TAG':'Y', 'TAT':'Z', 'TCA':'1', 'TCC':'2', 'TCG':'3', 'TCT':'4', 'TGA':'5', 'TGC':'6', 'TGG':'7', 'TGT':'8', 'TTA':'9', 'TTC':'0', 'TTG':' ', 'TTT':'.'
}
encode_string = 'OME'
decode_string = 'GGAGCGCTG'
inverted_mapping = dict(zip(mapping.values(), mapping.keys()))
def decode_dna( decode_string ):
pieces = [] for i in range( 0, len(decode_string), 3 ): piece = decode_string[i:i+3] pieces.append( mapping[piece] )
return "".join(pieces)
def encode_dna(encode_string): pieces = [] for i in encode_string: piece = inverted_mapping[i] pieces.append(piece) return "".join(pieces)
print 'Decoded String is:- '+ decode_dna(decode_string) print 'Encoded DNA String is:- '+ encode_dna(encode_string)
|
1.30. Gronsfeld
格罗斯费尔德密码(Gronsfeld cipher)实际上和维吉尼亚密码相同,除了使用了数字来代替字母以外没有什么区别。
在线解密
图形密码
这一部分较简单,对着表翻译就好,但也比较抽象,因为时常会出现奇奇怪怪的东西
2.1. 跳舞的小人
找到了三种不同的表,将密文与表一一对应即可(好像出自福尔摩斯)
2.2. 猪圈密码
猪圈密码在线转换
以下几张是变种猪圈
2.3. 圣堂武士密码
圣堂武士密码其实也是变种猪圈,不过比较有名
2.4. 银河字母
2.5. 凹凸字体
2.6. 夏多密码(曲折密码)
来源:作者麦克斯韦·格兰特在中篇小说《死亡之链》塑造夏多这一英雄人物中所自创的密码
整个夏多密码由两部分组成,码表和旋转方向
最后四个符号(1,2,3,4)可以出现在密文中的任意位置,它代表着在此之后的密文需要向什么方向旋转
2.7. 古埃及象形文字
2.8. 费兹象形文字
2.9. Flag Semaphore旗语
2.10. 船用信号旗
2.11. Dvorak键盘加密
利用两种键盘字母的排列顺序不同,进行的一种替换加密方式。
Dvorak键盘,中文名字是德沃夏克键盘,由奥古斯特·德沃夏克和威廉·迪利在1930年代期间设计
other
各种奇奇怪怪又抽象的实在太多了,可以参考下面两篇文章中的字符表
https://www.cnblogs.com/Nuy0ah/p/16138118.html
https://www.bilibili.com/read/cv19369626/