i=0; j=0; while(datalength--){ // 相当于执行1024次,这样生成的密钥流也是1024个字节 i = (i+1)mod256; j = (j+S[i])mod256; swap(S[i],S[j]); t = (S[i]+S[j])mod256; k = S[t]; 这里的k就是当前生成的一个密钥流中的一位 // 可以直接在这里进行加密,当然也可以将密钥流保存在数组中,最后进行异或就ok data[] = data[]^k; // 进行加密,^是异或运算符
解密按照前面写的,异或两次就是原文,所以只要把密钥流重新拿过来异或一次就能得到原文了
三、完整算法实现
1、C
//程序开始 #include<stdio.h> #include<string.h> typedefunsigned longULONG; /*初始化函数*/ voidrc4_init(unsignedchar*s, unsignedchar*key, unsignedlong Len) { int i = 0, j = 0; char k[256] = { 0 }; unsignedchar tmp = 0; for (i = 0; i<256; i++) { s[i] = i; k[i] = key[i%Len]; } for (i = 0; i<256; i++) { j = (j + s[i] + k[i]) % 256; tmp = s[i]; s[i] = s[j];//交换s[i]和s[j] s[j] = tmp; } } /*加解密*/ voidrc4_crypt(unsignedchar*s, unsignedchar*Data, unsignedlong Len) { int i = 0, j = 0, t = 0; unsignedlong k = 0; unsignedchar tmp; for (k = 0; k<Len; k++) { i = (i + 1) % 256; j = (j + s[i]) % 256; tmp = s[i]; s[i] = s[j];//交换s[x]和s[y] s[j] = tmp; t = (s[i] + s[j]) % 256; Data[k] ^= s[t]; } } intmain() { unsignedchar s[256] = { 0 }, s2[256] = { 0 };//S-box char key[256] = { "justfortest" }; char pData[512] = "这是一个用来加密的数据Data"; unsignedlong len = strlen(pData); int i; printf("pData=%s\n", pData); printf("key=%s,length=%d\n\n", key, strlen(key)); rc4_init(s, (unsignedchar*)key, strlen(key));//已经完成了初始化 printf("完成对S[i]的初始化,如下:\n\n"); for (i = 0; i<256; i++) { printf("%02X", s[i]); if (i && (i + 1) % 16 == 0)putchar('\n'); } printf("\n\n"); for (i = 0; i<256; i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!! { s2[i] = s[i]; } printf("已经初始化,现在加密:\n\n"); rc4_crypt(s, (unsignedchar*)pData, len);//加密 printf("pData=%s\n\n", pData); printf("已经加密,现在解密:\n\n"); //rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密钥 rc4_crypt(s2, (unsignedchar*)pData, len);//解密 printf("pData=%s\n\n", pData); return0; } //程序完
2、Python
# rc4.py import base64
defrc4_init_sbox(key): s_box = list(range(256)) # 没管秘钥小于256的情况,小于256不断重复填充即可 length = len(key) # print("原来的 s 盒:%s" % s_box) T = [] for i inrange(256): T.append(key[i % length]) j = 0 for i inrange(256): j = (j + s_box[i] + ord(T[i])) % 256 s_box[i], s_box[j] = s_box[j], s_box[i] print("混乱后的 s 盒:%s"% s_box) return s_box
defrc4_encrypt(s_box, data): res = [] i = j = 0 length = len(data) for k inrange(length): i = (i + 1) % 256 j = (j + s_box[i]) % 256 s_box[i], s_box[j] = s_box[j], s_box[i] t = (s_box[i] + s_box[j]) % 256 s = s_box[t] res.append(chr(ord(data[k]) ^ s)) result = "".join(res) print("RC4加密后的字符串是:%s" % result) print("RC4加密后(Base64编码)的字c符串是:" + str(base64.b64encode(result.encode('utf-8')), 'utf-8')) returnstr(base64.b64encode(result.encode('utf-8')), 'utf-8')
defrc4_decrypt(s_box, data): data = base64.b64decode(data.encode('utf-8')) data = bytes.decode(data) res = [] i = j = 0 length = len(data) for k inrange(length): i = (i + 1) % 256 j = (j + s_box[i]) % 256 s_box[i], s_box[j] = s_box[j], s_box[i] t = (s_box[i] + s_box[j]) % 256 s = s_box[t] res.append(chr(ord(data[k]) ^ s)) result = "".join(res) print("RC4解密后的字符串是:%s" % result) return result # main.py from rc4 import rc4_init_sbox, rc4_encrypt, rc4_decrypt
if __name__ == "__main__": whileTrue: function = input("E to encrypt or D to decrypt for rc4:") if function.upper() == 'E': data = input("请输入你要进行RC4加密的数据:") key = input("请输入RC4加密密钥:") s_box = rc4_init_sbox(key) rc4_encrypt(s_box, data) elif function.upper() == 'D': data = input("请输入你要进行RC4解密的数据:") key = input("请输入RC4解密密钥:") s_box = rc4_init_sbox(key) rc4_decrypt(s_box, data) else: print("请输入正确的功能")