RC4 与 DES 哪个算法最安全

JavaScript09

RC4 与 DES 哪个算法最安全,第1张

随机密钥加密算法:RC4位密码算法:DES 三重DES(Triple-DES)仍然是很安全的,但是也只是在别无他法的情况下的一个较好的选择。显然高级加密标准(AES)是一个更好的加密算法,NIST用AES代替Triple-DES作为他们的标准(下面有更详细的讨论)。其他较好的算法包括另外两个AES的变种算法Twofish和Serpent-也称为CAST-128,它是效率和安全的完美结合。这几个算法不仅比DES更安全,而且也比DES的速度更快。为什么要使用一些又慢又不安全的算法呢?SHA1是一个哈希函数,而不是一个加密函数。作为一个哈希函数,SHA1还是相当优秀的,但是还需要几年的发展才能用作加密算法。如果你正在设计一个新系统,那么谨记你可能会在若干年后用SHA1代替目前的算法。我再重复一遍:只是可能。呵呵,希望能帮到你!谢谢望采纳哦!

RC4算法的原理很简单,包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。假设S-box的长度为256,密钥长度为Len。先来看看算法的初始化部分(用C代码表示):

其中,参数1是一个256长度的char型数组,定义为: unsigned char sBox[256]

参数2是密钥,其内容可以随便定义:char key[256]

参数3是密钥的长度,Len = strlen(key) /*初始化函数*/void rc4_init(unsigned char*s,unsigned char*key, unsigned long Len){    int i=0,j=0    char k[256]={0}    unsigned char tmp=0    for(i=0i<256i++) {        s[i]=i        k[i]=key[i%Len]    }    for(i=0i<256i++) {        j=(j+s[i]+k[i])%256        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运算,得到密文,解密过程也完全相同。

再来看看算法的加密部分(用C代码表示):

其中,参数1是上边rc4_init函数中,被搅乱的S-box

参数2是需要加密的数据data

参数3是data的长度. /*加解密*/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]    }}最后,在main函数中,调用顺序如下: int main(){unsigned char s[256]={0},s2[256]={0}//S-boxchar key[256]={justfortest}char pData[512]=这是一个用来加密的数据Dataunsigned long len=strlen(pData)int iprintf(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(i=0i<256i++){    printf(%02X,s[i])    if(i&&(i+1)%16==0)putchar('\n')}printf(\n\n)for(i=0i<256i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!{    s2[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(s2,(unsigned char*)pData,len)//解密printf(pData=%s\n\n,pData)return0}因此最终的完整程序是: //程序开始#include<stdio.h>#include<string.h>typedef unsigned longULONG/*初始化函数*/void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len){    int i = 0, j = 0    char k[256] = { 0 }    unsigned char 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    }}/*加解密*/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 = 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]    }}int main(){    unsigned char s[256] = { 0 }, s2[256] = { 0 }//S-box    char key[256] = { justfortest }    char pData[512] = 这是一个用来加密的数据Data    unsigned long len = strlen(pData)    int i    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 (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, (unsigned char*)pData, len)//加密    printf(pData=%s\n\n, pData)    printf(已经加密,现在解密:\n\n)    //rc4_init(s,(unsignedchar*)key,strlen(key))//初始化密钥    rc4_crypt(s2, (unsigned char*)pData, len)//解密    printf(pData=%s\n\n, pData)    return 0}//程序完