一、简介
在密码学中,RC4是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。所谓对称加密,就是加密和解密的过程是一样的。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。
RC4已经成为一些常用的协议和标准的一部分,如1997年的WEP和2003/2004年无线卡的WPA; 和1995年的SSL,以及后来1999年的TLS。让它如此广泛分布和使用的主要因素是它不可思议的简单和速度,不管是软件还是硬件,实现起来都十分容易。
二、基本原理
- 加密:原文和Keystream进行异或得到密文
- 解密:密文和Keystream进行异或得到原文
三、生成秘钥流(KeyStream)
1、初始化S和T
for i=0 to 255 do
S[i]=i;
T[i]=K[ i mod len(key) ];
2、初始排列S
j=0;
for i=0 to 255 do
j=(j+S[i]+T[i]) mod 256;
swap(S[i],S[j]);
3、产生密钥流
i,j=0;
for r=0 to len do //r为明文长度,r字节
i=(i+1) mod 256;
j=(j+S[i]) mod 256;
swap(S[i],S[j]);
t=(S[i]+S[j]) mod 256;
k[r]=S[t];
在密码学中,S盒(Substitution-box)是对称密钥算法执行置换计算的基本结构。S盒用在分组密码算法中,是唯一的非线性结构,其S盒的指标的好坏直接决定了密码算法的好坏。
# coding=utf-8
import base64
def encrypt_logic(key, ciphertext):
S = rc4_init(key)
i = j = 0
result = ''
for a in ciphertext:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
k = chr(ord(a) ^ S[(S[i] + S[j]) % 256])
result += k
return result
def rc4_init(key): # S盒初始化置换,K为密钥
S = []
j = 0
k = [] # 临时数组
for i in range(256):
S.append(i)
k.append(key[i % len(key)])
for i in range(256):
j = (j + S[i] + ord(k[i])) % 256
S[i], S[j] = S[j], S[i] # 交换S[i],S[j]
return S
def rc4_encrypt(key,ciphertext):
result = encrypt_logic(key,ciphertext)
return base64.b64encode(result)
def rc4_decrypt(key,ciphertext):
result = encrypt_logic(key,base64.b64decode(ciphertext))
return result
if __name__ == '__main__':
key = 'abcdefghijk'
ciphertext = 'this is a test'
print("key:" + key)
print("message:" + ciphertext)
en_ciphertext = rc4_encrypt(key, ciphertext)
print("Encrypt:" + en_ciphertext)
de_ciphertext = rc4_decrypt(key, en_ciphertext)
print("Decrypt:" + de_ciphertext)
在安卓逆向中,RC4的特征并没有Base64那么明显,但是也可以根据S盒的长度、密钥流的产生过程及异或运算的特征来确定是否是RC4,当然,因为RC4属于流加密,所以也可以把明文的长度和加密后的长度是否相等作为入手点。