首页 > 编程知识 正文

不安全加密算法(与异或有关的加密算法)

时间:2023-05-04 08:11:02 阅读:64067 作者:3776

译文: http://www.as like.net/showart.ASP? id=147 RC4加密算法是著名的RSA三人组中人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。 之所以将其称为簇,是因为其核心部分的S-box长度是任意的,但一般为256字节。 该算法的速度可以达到DES加密的10倍左右,具有非常高水平的非线性。 RC4最初用于保护商业秘密。 但是,到了1994年9月,该算法被发布到互联网上,商业秘密也消失了。 RC4也被称为聚合RC 43354 (所谓的RC4 )。 因为RSA从来没有正式发布过这个算法。 原理RC4算法的原理很简单,包括大部分初始化算法(KSA )和伪随机子密码生成算法(PRGA )。 设s盒的长度为256,钥匙的长度为Len。 首先,我们来看看算法的初始化部分(用c代码表示)。 其中参数1是定义为: unsigned char sBox[256]的256个长度的char类型数组。 参数2是键,其内容可自由定义: char key[256]; 参数3是键的长度,len=strlen(key ); voidRC4_init(unsignedchar*s,unsigned char *key,unsigned long Len ) { int i=0,j=0,k[256]={0}; 无符号char tmp=0; for(I=0; i256; I () { s[i]=i; k[i]=key[i%Len]; (for ) I=0; i256; I () j=) js[I]k[I] ) %6; tmp=s[i]; s[i]=s[j]; s[i]和s [ j ] s [ j ]=交换tmp }初始化过程中,密钥的主要功能是扰动S-box,I保证S-box的各个元素得到处理,j保证S-box的扰动是随机的。 不同的S-box经过伪随机密码生成算法的处理可以得到不同的子密钥序列,S-box和明文进行xor运算可以得到密文,解密过程也完全相同。 看看算法的加密部分。 其中,参数1是上面的rc4_init函数中被扰乱的S-box。 参数2是需要加密数据data; 参数3是data的长度. voidRC4_crypt(unsignedchar*s,unsigned char *Data,unsigned long Len ) intx=0,y=0,t=0,I=无符号char tmp; for(I=0; iLen; I ) x=(x1 ) %6; y=(ys[x] ) %6; tmp=s[x]; s[x]=s[y]; s[x]和s [ y ] s [ y ]=交换tmp的t=(s[x]s[y] ) %6; Data[i] ^=s[t]; }最后,在main函数中,void main (() unsignedchars )={0}; //s-box charkey [ 256 ]={ ' justfortest ' }; char pData[512]='这是用于加密的数据Data '; ulonglen=Strlen(PDATA; printf(pData=%s(n )、pdata ); printf(key=%s,length=%dn ),key,Strlen ) key ); RC4_init(s,) unsigned char * ) key,Strlen ) key ); //RC4_crypt(s,(unsigned char * ) pData,len )初始化; //printf(pData=%snn ),加密pdata; RC4_crypt(s,)未指定char * (pdata,len ); //printf(pData=%snn ),解密pdata; }因此,最终的完整程序是://程序开始# include stdio.h # include string.htypedefunsignedlongulong; voidRC4_init(unsignedchar*s,unsigned char *key,unsigned long Len ) /初始化函数({ int i=0,j=0; char k[256]={0}; 无符号char tmp=0; for(I=0; i256; I () { s[i]=i; k[i]=key[i%Len]; (for ) I=0; i256; I () j=) js[I]k[I] ) %6; tmp=s[i]; s[i]=s[j]; s[i]和s [ j ] s [ j ]=交换tmp } void RC4 _ crypt (唯一char * s,唯一char * data,唯一长len ) /取消加密(unsigned long Len ) 无符号长整型=0; 无符号char tmp; for(k=0; 凯伦; k () I=) I1 ) %6; j=(js[I] ) %6; tmp=s[i]; s[i]=s[j]; s[x]和s [ y ] s [ j ]=交换tmp的t=(s[I]s[j] ) %6; Data[k] ^=s[t]; } } void main () unsignedchars(256 )={0},S2 ) 256 )={0}; //s-box charkey [ 256 ]={ ' justfortest ' }; char pData[512]='这是用于加密的数据Data '; ulonglen=Strlen(PDATA; printf(pData=%s(n )、pdata ); printf(key=%s,length=%dnn ),key,strlen ) key ); RC4_init(s,) unsigned char * ) key,Strlen ) key ); printf初始化完成() s ) I )初始化。 nn ) ); for(intI=0; i256; I ) {printf('%-3d ',s[i] ); }printf((n(n ) ); for(I=0; i256; I(//初始化的s ) I )在s2 ) I )中暂时保留很重要! { s2[i]=s[i]; } printf ()已初始化,目前已加密:nn )。 RC4_crypt(s,)未指定char * (pdata,len ); //printf(pData=%snn ),加密pdata; printf ('已加密。 当前:nn ); RC4_init(s,) unsigned char * ) key,Strlen ) key ); //初始化密钥RC4_crypt(S2,) unsigned char * (pdata,len ); //printf(pData=%snn ),解密pdata; //程序漏洞RC4算法的加密使用xor,因此如果子密钥数组重复,则可能会解密密文。 有关如何解密xor加密的信息,请参阅Bruce Schneier应用程序编写器一书的1.4节Simple XOR。 这里不详细说明。 那么,RC4算法生成的子密钥数组是否重复? 由于存在部分弱密钥,子密钥串在小于100万字节时完全重复,如果是部分重复,则在小于10万字节时可能重复,因此使用RC4算法时,必须测试加密密钥以确定是否是弱密钥。 其不足主要表现在无线网络中IV (初始化向量)不变性的脆弱性。 另外,根据目前的分析结果,对于密钥长度达到128位的RC4没有任何有效的分析,所以RC4是目前最安全的加密算法之一,可以放心使用!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。