从代码逆向角度学习常见加密算法

一、对称加密

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的补位字符

 

 

  

 

posted @ 2021-12-19 23:57  re0juren  阅读(136)  评论(0编辑  收藏  举报