从代码逆向角度学习常见加密算法
一、对称加密
1.RC4
之前blog以做过学习,最典型的特征为加密的两个部分:初始化部分、加密部分
初始化部分工作为根据密钥完成S表的初始化话
加密部分是根据S表完成异或运算
典型特征为swap()过程
def rc4_init(): for i in range(0,256): s[i]=i t[i]=ord(key[i%8]) v9=0 for i in range(0,256): middle=s[i] v9=(v9+s[i]+t[i])%256 s[i]=s[v9] s[v9]=middle def rc4_encrpto(): v4=0 v3=0 v5=0 for i in range(0,38): v4=(v4+1)%256 v5=s[v4] v3=(v3+s[v4])%256 s[v4]=s[v3] s[v3]=s[v5] res[i]^=s[(v5+s[v4])%256]
2.base64:
核心过程为3个字符拓展成4个字符,3个字符对应24个bit,分成4组,每组前两位补0(2的6次方=64,对应64个替换字符),将新的8bit转换成对应的10进制,对0-63对应密码表中设定的字符。
不是3的倍数的字符长度在末尾补“=”
if len(string) % 3 == 1: base += '==' elif len(string) % 3 == 2: base += '='
明显特征:字符表、3个字符和4个字符之间的转换关系,末尾补‘=’;
密文特征也十分明显,即结尾处会多次出现“=”或者“==”;
len(密文)=len(明文)*(4/3)
##特别注意码表被替换过的base46加密:
1.base64类似的加密,根据密文长度推断明文长度:
密文长度16,2个补位字符;(16/4)*3=12;再减去2个补位,即明文长度为10
2.密文频繁出现的一个或连续两个字符,可以断定是base64的补位字符