#include <stdlib.h>
#include <string.h>
typedef unsigned long ULONG
void rc4_init(unsigned char *s, unsigned char *data,unsigned Len) { //初始化函数
int i,j
unsigned char k[256] = {0},tmp
for(i = 0i <256i++) {
s[i] = i
k[i] = data[i%Len]
}
for(i = 0i <256i++) {
j = (j + s[i] + k[i])%Len
tmp = s[i]
s[i] = s[j]//交换s[i]和s[j]
s[j] = tmp
}
}
void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len) { //加解密
int i = 0, j = 0, t = 0
unsigned long k = 0
unsigned char tmp
for(k = 0k <Lenk++) {
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]
}
}
int main() {
unsigned char s[256] = {0},st[256] = {0}//S-box
char key[256] = "just for test"
char pData[512] = "待加密数据Data"
ULONG len = strlen(pData)
printf("pData = %s\n",pData)
printf("key = %s, length = %d\n\n",key,strlen(key))
rc4_init(s,(unsigned char *)key,strlen(key))//初始化
printf("完成对S[i]的初始化,如下:\n\n")
for(int i = 0i <256i++) {
printf("%-3d ",s[i])
}
printf("\n\n")
for(i = 0i <256i++) { //用st[i]暂时保留经过初始化的s[i],很重要的!!!
st[i] = s[i]
}
printf("已经初始化,现在加密:\n\n")
rc4_crypt(s,(unsigned char *)pData,len)//加密
printf("pData = %s\n\n",pData)
printf("已经加密,现在解密:\n\n")
rc4_init(s,(unsigned char *)key,strlen(key)) //初始化密钥
rc4_crypt(st,(unsigned char *)pData,len)//解密
printf("pData = %s\n\n",pData)
return 0
}
void re_RC4(unsigned char *S,char *key){
unsigned char T[255]={0} //问题在这,你的re_T第一个参数是unsigned char *,你传递的参数是//char,所以不对
re_S(S)
re_T(T,key)
re_Sbox(S,T)
}