RC4流密碼算法之C語言實現(xiàn)_第1頁
RC4流密碼算法之C語言實現(xiàn)_第2頁
RC4流密碼算法之C語言實現(xiàn)_第3頁
RC4流密碼算法之C語言實現(xiàn)_第4頁
RC4流密碼算法之C語言實現(xiàn)_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、RC4流密碼算法之C語言實現(xiàn)RC4加密算法RC4算法的原理很簡單,包括初始化算法(KSA)和偽隨機子密碼生成算法(PRGA)兩大部分。假設(shè)S-box長度和密鑰長度均為為n。先來看看算法的初始化部分(用類C偽代碼表示):for (i=0; in; i+)s=i;在初始化的過程中,密鑰的主要功能是將S-box攪亂,i確保S-box的每個元素都得到處理,j保證S-box的攪亂是隨機的。而不同的S-box在經(jīng)過偽隨機子密碼生成算法的處理后可以得到不同的子密鑰序列,并且,該序列是隨機的:j=0;for (i=0; in; i+)j=(j+s+k)%256;swap(s, sj);i=j=0;得到的子密碼

2、sub_k用以和明文進行xor運算,得到密文,解密過程也完全相同。根據(jù)目前的分析結(jié)果,沒有任何的分析對于密鑰長度達到128位的RC4有效,所以,RC4是目前最安全的加密算法之一,大家可以放心使用!while (明文未結(jié)束)+i%=n;j=(j+s)%n;swap(s, sj);sub_k=s(s+sj)%n);位長可以自己隨意設(shè)置,將256設(shè)置為你希望的即可我的C語言源碼:平臺:windowsXP,VC+6.0有什么大家可以討論的地方請留言或發(fā)郵件至我郵箱:#include#include#includevoid swap(unsigned char *s1,unsigned char *s2

3、)char temp;temp=*s1;*s1=*s2;*s2=temp;void re_S(unsigned char *S)unsigned int i;for(i=0;i256;i+) Si=i;void re_T(unsigned char *T,char *key)int i;int keylen;keylen=strlen(key);for(i=0;i256;i+) Ti=keyi%keylen;void re_Sbox(unsigned char *S,unsigned char *T)int i;int j=0;for(i=0;i256;i+) j=(j+Si+Ti)%256;

4、 swap(&Si,&Sj);void re_RC4(unsigned char *S,char *key)char T255=0;re_S(S);re_T(T,key);re_Sbox(S,T);void RC4(FILE *readfile,FILE *writefile,char *key) unsigned char S255=0;unsigned char readbuf1;int i,j,t; re_RC4(S,key);i=j=0;while(fread(readbuf,1,1,readfile) i = (i + 1) % 256; j = (j + Si) % 256; sw

5、ap(&Si,&Sj); t = (Si + (Sj % 256) % 256; readbuf0=readbuf0St; 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 = argv1;Filename2 = argv2;key=argv3;if ( argc = 4) printf(*正在加密中*n);else p

6、rintf(輸入格式: n); printf(文件名|加密或解密文件名|存放文件名|密鑰 n); return -1; if (file1= fopen(Filename1,rb) = NULL| (file2 = fopen(Filename2,wb)=NULL) printf(Cant open filen); return -1; RC4(file1,file2,key);fclose(file1);fclose(file2);return 0;加密解密算法 RC5- -#include #include math.h#include static const w=32;static c

7、onst r=12;static const b=16;static const t=26;/2*r+2=12*2+2static const c=4; /r*8/b = 16*8/32 typedef unsigned long int FOURBYTEINT;typedef unsigned char BYTE;/* 循環(huán)左移和右移函數(shù)* x : 被循環(huán)的數(shù)* y : 將要循環(huán)的位數(shù)*/#define ROTL(x,y) (x)(w-(y&(w-1)#define ROTR(x,y) (x)(y&(w-1) | (x)(w-(y&(w-1)/* 產(chǎn)生子密鑰的函數(shù)*/void generat

8、eChildKey(unsigned char*,FOURBYTEINT*);/* 產(chǎn)生初試密鑰的函數(shù)*/void InitialKey(unsigned char* KeyK,int b)for(int i=0;ib;i+) KeyKi=0;int intiSeed=3;KeyK0=intiSeed;for(i=1;ib;i+) KeyKi = (BYTE) ( (int)(pow(3,i)%(255-i) ); /KeyKi = KeyKi-1*intiSeed % 256;/* 取最近奇數(shù)的函數(shù)*/int Odd(double fl)int floorOffl = (int)floor(

9、fl);if (floorOffl% 2=0) return floorOffl+1;return floorOffl;/* 加密函數(shù)*/void Encipher(FOURBYTEINT* In,FOURBYTEINT* Out,FOURBYTEINT* S)FOURBYTEINT X,Y;X = In0+S0;Y = In1+S1;for(int i=1;i0;i-) Y = ROTR(Y-S2*i+1,X)X; X = ROTR(X-S2*i,Y)Y; Out0=X - S0;Out1=Y - S1;/* 主函數(shù)*/void main() FOURBYTEINT ChildKeyS2*r

10、+2; /64bitunsigned char KeyKb;/8bit=byteInitialKey(KeyK,b);int k;generateChildKey(KeyK,ChildKeyS);FOURBYTEINT Source2=8888,6666;/coutSource0 Source1endl;printf(加密以前的明文:);for (k=0;k2;k+) printf(%.8lX ,Sourcek);FOURBYTEINT Dest2;Encipher(Source,Dest,ChildKeyS);/coutDest0 Dest1endl;printf(n);printf(加密以

11、后的密文:);for (k=0;k2;k+) printf(%.8lX ,Destk);printf(n);Decipher(Dest,Source,ChildKeyS);/coutSource0 Source1endl;printf(解密以后的明文:);for (k=0;k2;k+) printf(%.8lX ,Sourcek);printf(n);/*printf(加密以前的明文:);for (k=0;k6;k+) printf(%.8lX ,mingwen_orgk);printf(n);printf(加密以后的密文:);for (k=0;k6;k+) printf(%.8lX ,miw

12、enk);printf(n);printf(解密以后的明文:);for (k=0;k6;k+) printf(%.8lX ,mingwen_finalk);printf(n);*/void generateChildKey(unsigned char* KeyK,FOURBYTEINT* ChildKeyS)const double e = 2.9;const double Phia = 1.9;/int PW = Odd(e-1)*pow(2,w);int PW = 0xb7e15163;/int QW = Odd(Phia -1)*pow(2,w);int QW = 0x9e3779b9;int i;FOURBYTEINT Lc;/初試化數(shù)組 SChildKeyS0=PW;for ( i=1;it;i+) ChildKeySi=(ChildKeySi-1+ QW);/% (2w)不需要/transform from K to L/initialization Lfor(i=0;ic;i+) Li=0;int u = w/8;for (i=b-1;i!=-1; i-) Li/u = (Li/u8)+KeyKi;for (i=0;i4;i+)printf(%.8Xn,Li);/generate child k

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論