RC4加密算法的原理及实现

RC4于1987年提出,和DES算法一样,是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥)。但不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。

RC4算法的特点是算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节(8-2048比特),在如今技术支持的前提下,当密钥长度为128比特时,用暴力法搜索密钥已经不太可行,所以可以预见RC4的密钥范围任然可以在今后相当长的时间里抵御暴力搜索密钥的攻击。实际上,如今也没有找到对于128bit密钥长度的RC4加密算法的有效攻击方法。

在介绍RC4算法原理之前,先看看算法中的几个关键变量:

1、密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节,因为密文第i字节=明文第i字节^密钥流第i字节;

2、状态向量S:长度为256,S[0],S[1].....S[255]。每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换;

3、临时向量T:长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给T,否则,轮转地将密钥的每个字节赋给T;

4、密钥K:长度为1-256字节,注意密钥的长度keylen与明文长度、密钥流的长度没有必然关系,通常密钥的长度趣味16字节(128比特)。

RC4的原理分为三步:

1、初始化S和T

for i=0 to 255 do

S[i]=i;

T[i]=K[ imodkeylen ];

2、初始排列S

j=0;

for i=0 to 255 do

j= ( j+S[i]+T[i])mod256;

swap(S[i],S[j]);

3、产生密钥流

i,j=0;

for r=0 to len do  //r为明文长度,r字节

i=(i+1) mod 256;

j=(j+S[i])mod 256;

swap(S[i],S[j]);

t=(S[i]+S[j])mod 256;

k[r]=S[t];

下面给出RC4加密解密的C++实现:

加密类:

/*
    加密类
*/
class RC4 {
public:
    /*
        构造函数,参数为密钥长度
    */
    RC4(int kl):keylen(kl) {
        srand((unsigned)time(NULL));
        for(int i=0;i<kl;++i){  //随机生产长度为keylen字节的密钥
            int tmp=rand()%256;
            K.push_back(char(tmp));
        }
    }
    /*
        由明文产生密文
    */
    void encryption(const string &,const string &,const string &);

private:
    unsigned char S[256]; //状态向量,共256字节
    unsigned char T[256]; //临时向量,共256字节
    int keylen;        //密钥长度,keylen个字节,取值范围为1-256
    vector<char> K;      //可变长度密钥
    vector<char> k;      //密钥流

    /*
        初始化状态向量S和临时向量T,供keyStream方法调用
    */
    void initial() {
        for(int i=0;i<256;++i){
            S[i]=i;
            T[i]=K[i%keylen];
        }
    }
    /*
        初始排列状态向量S,供keyStream方法调用
    */
    void rangeS() {
        int j=0;
        for(int i=0;i<256;++i){
            j=(j+S[i]+T[i])%256;
            //cout<<"j="<<j<<endl;
            S[i]=S[i]+S[j];
            S[j]=S[i]-S[j];
            S[i]=S[i]-S[j];
        }
    }
    /*
        生成密钥流
        len:明文为len个字节
    */
    void keyStream(int len);

};
void RC4::keyStream(int len) {
    initial();
    rangeS();

    int i=0,j=0,t;
    while(len--){
        i=(i+1)%256;
        j=(j+S[i])%256;

        S[i]=S[i]+S[j];
        S[j]=S[i]-S[j];
        S[i]=S[i]-S[j];

        t=(S[i]+S[j])%256;
        k.push_back(S[t]);
    }
}
void RC4::encryption(const string &plaintext,const string &ks,const string &ciphertext) {
    ifstream in;
    ofstream out,outks;

    in.open(plaintext);
    //获取输入流的长度
    in.seekg(0,ios::end);
    int lenFile=in.tellg();
    in.seekg(0, ios::beg);

    //生产密钥流
    keyStream(lenFile);
    outks.open(ks);
    for(int i=0;i<lenFile;++i){
        outks<<(k[i]);
    }
    outks.close();

    //明文内容读入bits中
    unsigned char *bits=new unsigned char[lenFile];
    in.read((char *)bits,lenFile);
	in.close();

    out.open(ciphertext);
    //将明文按字节依次与密钥流异或后输出到密文文件中
    for(int i=0;i<lenFile;++i){
        out<<(unsigned char)(bits[i]^k[i]);
    }
<span style="white-space:pre">	</span>out.close();

    delete []bits;
}

解密类:

/*
    解密类
*/
class RC4_decryption{
public:
    /*
        构造函数,参数为密钥流文件和密文文件
    */
    RC4_decryption(const string ks,const string ct):keystream(ks),ciphertext(ct) {}
    /*
        解密方法,参数为解密文件名
    */
    void decryption(const string &);

private:
    string ciphertext,keystream;
};
void RC4_decryption::decryption(const string &res){
    ifstream inks,incp;
    ofstream out;

    inks.open(keystream);
    incp.open(ciphertext);

    //计算密文长度
    inks.seekg(0,ios::end);
    const int lenFile=inks.tellg();
    inks.seekg(0, ios::beg);
    //读入密钥流
    unsigned char *bitKey=new unsigned char[lenFile];
    inks.read((char *)bitKey,lenFile);
    inks.close();
    //读入密文
    unsigned char *bitCip=new unsigned char[lenFile];
    incp.read((char *)bitCip,lenFile);
    incp.close();

    //解密后结果输出到解密文件
    out.open(res);
    for(int i=0;i<lenFile;++i)
        out<<(unsigned char)(bitKey[i]^bitCip[i]);

    out.close();
}

程序实现时,需要注意的是,状态向量数组S和临时向量数组T的类型应设为unsigned char,而不是char。因为在一些机器下,将char默认做为signed char看待,在算法中计算下标i,j的时候,会涉及char转int,如果是signed的char,那么将char的8位拷贝到int的低8位后,还会根据char的符号为,在int的高位补0或1。由于密钥是随机产生的,如果遇到密钥的某个字节的高位为1的话,那么计算得到的数组下标为负数,就会越界。

程序运行示例

main函数:

int main(){
    RC4 rc4(16); //密钥长16字节
    rc4.encryption("明文.txt","密钥流.txt","密文.txt");

    RC4_decryption decrypt("密钥流.txt","密文.txt");
    decrypt.decryption("解密文件.txt");

}

明文:我爱小兔子!

密文:‘柀L&#15;&t餥6洲

密钥流:镈&#25;膺嚬3屽u

解密文件:我爱小兔子!

这是第一篇网络安全方面的博客,如有错误,欢迎指正!

RC4加密算法的原理及实现

时间: 2024-10-09 22:50:10

RC4加密算法的原理及实现的相关文章

RC4加密算法及其实现

RC4加密算法(http://en.wikipedia.org/wiki/RC4)是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇.之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节.该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性.RC4起初是用于保护商业机密的.但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了.RC4也被叫做ARC4(Alleged RC4——所谓的RC4)

RC4加密算法

RC4于1987年提出,和DES算法一样,是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥).但不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密. RC4算法的特点是算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节(8-2048比特),在如今技术支持的前提下,当密钥长度为128比特时,用暴力法搜索密钥已经不太可行,所以可以预见RC4的密钥范围任然可以在今后相当长的时间里抵御暴力搜

RC4加密算法实践

加密算法简说 ??加密其实并不是那么神秘,尝试后,加密应用起来也是很简单的,虽然自己一时想不到经典的加密算法出来. ??加密算法种类: 对称加密:加密解密密钥相同: 非对称加密:加密解密使用不同的密钥: ??常见加密算法: RC4:对称算法.可变长密钥.对大量数据加密.速度快.明文长度不一: DEC:对称算法.速度较快.对大量数据加密: IDEA:对称算法.128位密钥: RSA:非对称算法.公钥+密钥: RC4加密算法实践 ??对于RC4加密算法,密钥长度达到128位时,暴力破解基本很难破解了

php rc4加密算法实例代码

分享一个php rc4加密算法实例代码,此php加密算法的解密方法是重新加密一次,便可还. /* * rc4加密算法 * $pwd 密钥 * $data 要加密的数据 */ function rc4 ($pwd, $data)//$pwd密钥 $data需加密字符串 { $key[] =""; $box[] =""; $pwd_length = strlen($pwd); $data_length = strlen($data); for ($i = 0; $i &

AES 加密算法的原理详解

AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分. AES简介 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的).对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 下面简单介绍下各个部分的作用与意义: 明文P 没有经过加密的数据. 密钥K 用来加密明文的密码,在对称

DES加密算法详细原理以及Java代码实现

本周的密码学实验要求使用任意编程语言来实现des加密算法,于是我在查阅了相关资料后有了以下成果. 首先,DES算法作为经典的分块密码(block cipher),其主要的实现过程由两部分组成,分别是密钥的生成以及明文的处理. 加密的大致流程如图所示 作为分块密码,密钥的输入以及明文的输入均为64位2进制数. 下面首先来说密钥的生成过程. 密钥处理部分如图所示 密钥的输入为64位,例如00010011 00110100 01010111 01111001 10011011 10111100 110

RC4加密解密算法原理与完整源代码实例演示

RC4加密算法 RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇.之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节.该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性.RC4起初是用于保护商业机密的.但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了.RC4也被叫做ARC4(Alleged RC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法. 原理 R

对称加密算法之RC4介绍及OpenSSL中RC4常用函数使用举例

RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码. RC4是流密码streamcipher中的一种,为序列密码.RC4加密算法是Ron Rivest在1987年设计出的密钥长度可变的加密算法簇.起初该算法是商业机密,直到1994年,它才公诸于众.由于RC4具有算法简单,运算速度快,软硬件实现都十分容易等优点,使其在一些协议和标准里得到了广泛应用. 流密码也属于对称密码,但与分组加密算法不同的是,流密码不对明

java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4

概述 信息安全基本概念: DES(Data Encryption Standard,数据加密标准) 3DES(Triple DES,三重数据加密算法(TDEA,Triple Data Encryption Algorithm)) AES(Advanced Encryption Standard,高级加密标准) Blowfish RC2 RC4 DES DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定