密码学特征分类:
Base族
特征:base64,base32的密文都有等于号“=”
Base16
base16就是16进制转ASCII问题
base16中只有数字0-9以及大写字母ABCDEF
Base32
base32编码是由大写字母(A-Z)和234567组成
与base64类似
Base64
base64是由大写字母(A-Z),小写字母(a-z),数字(0-9)以及 +/ 组成
Base64是把3个字节变成4个可打印字符( Base64加密原理: 要求把每三个8bit的字节转换为四个6bit的字节,然后6bit再添两位高位0,组成四个8bit字节,再将转换后的四个8bit字节当作索引,依次从编码表“A-Za—z1-0+/”中取值,最终得到编码结果),所以Base64编码后的字符串长度一定能被4整除 ,并且Base64编码后一定存在0个,1个或2个等号。(因为如果字符不足则会用“=”补齐,特征很明显)。
凯撒密码
与偏移量有关
明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
当题目没有给出位移量的时候(我就没见题目给过)就全部给列出来然后寻找真正的字符串。记住:他只位移字母
以下是凯撒加密的伪代码
变异凯撒
密文中每个字母的偏移量都不相同,具体解密规则需要自己找规律
rot族
ROT5
只对数字进行编码,用当前数字往前数的第5个数字替换当前数字
例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。
ROT13
ROT13(回转13位)是一种简易的替换式密码算法。应用ROT13到一段文字上仅仅只需要检查字母顺序并取代它在13位之后的对应字母,有需要超过时则重新绕回26英文字母开头即可。A换成N、B换成O、依此类推到M换成Z,然后串行反转:N换成A、O换成B、最后Z换成M。只有这些出现在英文字母里的字符受影响,数字、符号、空白字符以及所有其他字符都不变。替换后的字母大小写保持不变。
简单的说就是通过将输入的原字符串ASCII+13/或者ASCC-13:
原字符串:
ABCDEFGHIJKLM NOPQRSTUVWXYZ abcdefghijklm nopqrstuvwxyz
转换成:
NOPQRSTUVWXYZ ABCDEFGHIJKLM nopqrstuvwxyz abcdefghijklm
ROT18
这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。
ROT47
对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符
例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126
摩斯密码
一般出现形式“.”和“-”或者为0和1
通过“ . ‘’和” __ ”的排列组合表示相应字符,其中“ / ”表示分隔符
Quotedprintable编码
1 | =E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6 |
任何一个8位的字节值可编码为3个字符:一个等号“=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值。
例如:ASCII码换页符(十进制值为12)可以表示为”=0C”。
除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式。所有可打印ASCII字符(十进制值的范围为33到126)可用ASCII字符编码来直接表示,但是等号“=”(十进制值为61)不可以这样直接表示,等号”=”(十进制值为61)必须表示为”=3D”。ASCII的水平制表符(tab)与空格符(即:十进制为9和32),如果不出现在行尾则可以用其ASCII字符编码直接表示。如果这两个字符出现在行尾,必须QP编码表示为“=09”(tab)或“=20”(space)。
如果数据中包含有意义的行结束标志,必须转换为ASCII回车(CR)换行(LF)序列,既不能用原来的ASCII字符也不能用QP编码的“=”转义字符序列。 相反,如果字节值13与10有其它的不是行结束的含义,它们必须QP编码为=0D与=0A。
Quoted-Printable编码的数据的每行长度不能超过76个字符。为满足此要求又不改变被编码文本,在QP编码结果的每行末尾加上软换行(soft line break)。 即在每行末尾加上一个”=”, 但并不会出现在解码得到的文本中。
很多时候,我们用些常见字符表示所有8位其它非打印字符,这种通过Quoted-Printable编码,只是对该字节转为16进制后,做简单增加前缀!然后做些特殊字符处理即可! 它的简单,及编码高效,也让该编码在邮件格式里面,得到了广泛使用。
栅栏密码
所谓栅栏密码,就是把明文分成N个组,然后取出每组的第一个,每组的第二个。接着按顺序排列得出密文。
若每个组里有2两个元素的话就叫2栏栅栏密码。
培根加密
如果你看到一串字符里全是A和B,并且5个一组的时候,没错了,就是他。培根加密只能加密字母。
例如,flag ==>AABAB ABABB AAAAA AABBA
jother编码
在javascript语言中,利用少量特定字符构造精简的匿名函数对与字符串的编码方式.代码中大量出现“+”、“!”、“(”、“)”、“[”、“]”、“{”、“}”字符
例如:!![]+!![]+!![]+!![]+!![]+!![] 打开控制台(按F12),输入密文进行解密
ook编码
类似于摩斯密码,密文中有ook?ook.等等,在线解密即可
进制转换
特征:二进制 b开头,八进制 o开头,十进制 d开头,十六进制 x开头
MD5加密
- 长度固定(无论输入多少字节,输出总是16字节)
- 不可逆(从结果无法反推原始数据)
- 具有高度的离散性(输出的16字节数据,没有任何规律可言,无法预测结果)
- 抗碰撞性(在原始数据固定的情况下,几乎不会出现两个数据的MD5相同)
RSA加密
RSA算法参数
RSA加密
RSA解密
伪代码中判别是rsa加密解密的函数:
__gmpz_init_set_str 其实就是 mpz_init_set_str
int mpz_init_set_str (mpz_t rop, const char *str, int base) 函数:
这三个参数分别是多精度整数变量,字符串,进制。 这个函数的作用就是将 str 字符数组以 base 指定的进制解读成数值并写入 rop 所指向的内存。
void mpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod) 函数: 其实就是计算 base 的 exp 次方,并对 mod 取模,最后将结果写入 rop 中, 这个运算的过程和RSA的加密过程一样。
注意:
出现“65537”(即e)是很明显的rsa加密的标志
伪代码所给的数据中可能有16进制,10进制等,需要统一进制再解密
Rabbit加密
以U2fsd开头的密文,直接在线解密
网页可解析的编码
通常一个网页中可解析的总共有三种编码,每种编码都能用来代替表示字符,按解析顺序依次是“html实体编码”“urlcode码”“Unicode码”,在执行过程中会在HTML环境下先解析“html实体编码”和“urlcode码”,然后查看有无js环境并解析其中的Unicode编码,对于三者的理解都有助于我们绕过限制正则,实行渗透。
URL转码
1 | %66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d |
url编码是一种浏览器用来打包表单输入的格式。(字符串中有“%”)
URL用来编码ASCII码无法表示的字符、不安全的字符( { } | \ ^ ~ ` [ ] )、保留字符( ; / ? : @ = & ),只有字母和数字[0-9a-zA-Z]、具有特殊含义的保留字符以及非保留字符,才可以不经过编码直接用于 URL。
例如,%66%6C%61%67%7B%61%6E%64%20%31%3D%31%7D就是经过URL编码得到的密文
unicode编码
Unicode码扩展自ASCII字元集,使用全16位元字元集。Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符,字符编码一般用十六进制来表示.
例如:\u4e16\u754c\u4f60\u597d
HTML编码
HTML 实体是一段以’**&#‘开头、加上ASCII码居中、以分号**‘;’结尾的文本,如:“ ;”,实体常常用于显示保留字符,和不可见的字符,作为HTML环境第一次解析的编码,这些字符可能还会进一步被解析为 urlcode、js 代码
编码可用10进制表示,也可使用16进制表示。如:1和1均表示1