从代码逆向角度学习常见加密算法
一、对称加密
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的补位字符

浙公网安备 33010602011771号