RC4流密码算法之C语言实现
RC4加密算法
RC4算法的原理很简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。假设S-box长度和密钥长度均为为n。先来看看算法的初始化部分(用类C伪代码表示): for (i=0; i s=i; 在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,并且,该序列是随机的: j=0; for (i=0; i j=(j+s+k)%6; swap(s, s[j]); } i=j=0; 得到的子密码sub_k用以和明文进行xor运算,得到密文,解密过程也完全相同。 根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用! while (明文未结束) { ++i%=n; j=(j+s)%n; swap(s, s[j]); sub_k=s((s+s[j])%n); } 位长可以自己随意设置,将256设置为你希望的即可 我的C语言源码: 平台:windowsXP,VC++6.0 有什么大家可以讨论的地方请留言或发邮件至我邮箱: #include void swap(unsigned char *s1,unsigned char *s2) { char temp; temp=*s1; *s1=*s2; *s2=temp; } void re_S(unsigned char *S) { unsigned int i; for(i=0;i<256;i++) S[i]=i; } void re_T(unsigned char *T,char *key) { int i; int keylen; keylen=strlen(key); for(i=0;i<256;i++) T[i]=key[i%keylen]; } void re_Sbox(unsigned char *S,unsigned char *T) { int i; int j=0; for(i=0;i<256;i++) { j=(j+S[i]+T[i])%6; swap(&S[i],&S[j]); } } void re_RC4(unsigned char *S,char *key) { char T[255]={0}; re_S(S); re_T(T,key); re_Sbox(S,T); } void RC4(FILE *readfile,FILE *writefile,char *key) { unsigned char S[255]={0}; unsigned char readbuf[1]; int i,j,t; re_RC4(S,key); i=j=0; while(fread(readbuf,1,1,readfile)) { i = (i + 1) % 256; j = (j + S[i]) % 256; swap(&S[i],&S[j]); t = (S[i] + (S[j] % 256)) % 256; readbuf[0]=readbuf[0]^S[t]; fwrite(readbuf,1,1,writefile); memset(readbuf,0,1); } printf(\加密|解密成功!!!\\n\} int main(int argc,char *argv[]) { char *Filename1,*Filename2; char *key; FILE *file1,*file2; Filename1 = argv[1]; Filename2 = argv[2]; key=argv[3]; if ( argc == 4) { printf(\正在加密中*******************\\n\} else { printf(\输入格式: \\n\ printf(\文件名|加密或解密文件名|存放文件名|密钥 \\n\ return -1; } if ((file1= fopen(Filename1,\fopen(Filename2,\{ printf(\ return -1; } RC4(file1,file2,key); fclose(file1); fclose(file2); return 0; } 加密解密算法 RC5- - #include static const w=32; static const r=12; static const b=16; static const t=26;//2*r+2=12*2+2 static const c=4; //r*8/b = 16*8/32 typedef unsigned long int FOURBYTEINT; typedef unsigned char BYTE; /** * 循环左移和右移函数 * x : 被循环的数 * y : 将要循环的位数 */ #define ROTL(x,y) (((x)<<(y&(w-1))) | ((x)>>(w-(y&(w-1))))) #define ROTR(x,y) (((x)>>(y&(w-1))) | ((x)<<(w-(y&(w-1))))) /** 产生子密钥的函数 */ void generateChildKey(unsigned char*,FOURBYTEINT*); /** 产生初试密钥的函数 */ void InitialKey(unsigned char* KeyK,int b){ for(int i=0;i int intiSeed=3; KeyK[0]=intiSeed; for(i=1;i KeyK[i] = (BYTE) ( ((int)(pow(3,i)))%(255-i) ); //KeyK[i] = KeyK[i-1]*intiSeed % 256; } } /** 取最近奇数的函数 */ int Odd(double fl){ int floorOffl = (int)floor(fl); if (floorOffl% 2==0) return floorOffl+1; return floorOffl; } /** 加密函数 */ void Encipher(FOURBYTEINT* In,FOURBYTEINT* Out,FOURBYTEINT* S){ FOURBYTEINT X,Y; X = In[0]+S[0]; Y = In[1]+S[1]; for(int i=1;i<=r;i++){ X=ROTL((X^Y),Y) + S[2*i]; Y=ROTL((Y^X),X) + S[2*i+1]; } Out[0]=X; Out[1]=Y; } /** 解密函数 */ void Decipher(FOURBYTEINT* In,FOURBYTEINT* Out,FOURBYTEINT* S){ FOURBYTEINT X,Y; X = In[0]; Y = In[1]; for(int i=r;i>0;i--){ Y = ROTR(Y-S[2*i+1],X)^X; X = ROTR(X-S[2*i],Y)^Y; } Out[0]=X - S[0]; Out[1]=Y - S[1];