本文简单实现了RC4算法对于文件的加解密,并已经验证成功。同时实现了对RC4算法加解密较大文件的测速

RC4加密解密算法的原理:

首先,通过我的理解,RC4算法所依赖的最根本原理是:对明文使用同一个密钥异或两次最后仍是得到原文。即生成密钥之后,由密钥与明文异或后生成密文(加密过程),由同一密钥与密文异或后得到明文(解密过程)。

下面对RC4算法的具体实现进行简单介绍。

加密算法工具 maven 加密算法实现_密码学

(此图片参考自其他博客,具体地址已经忘记,烦请作者与我联系)

1、先初始化状态向量S(256个字节,用来作为密钥流生成的种子1)

按照升序,给每个字节赋值0,1,2,3,4,5,6.....,254,255

加密算法工具 maven 加密算法实现_密钥流_02

2、初始密钥(由用户输入),长度任意。如果输入长度小于256个字节,则进行轮转,直到填满。例如输入密钥的是“1,2,3,4,5”, 那么填入的是1,2,3,4,5, 1,2,3,4,5, 1,2,3,4,5........

加密算法工具 maven 加密算法实现_加解密_03

 

加密算法工具 maven 加密算法实现_加密算法工具 maven_04

由上述轮转过程得到256个字节的向量T(用来作为密钥流生成的种子2)。

3、开始对状态向量S进行置换操作(用来打乱初始种子1),按照下列规则进行:

从第零个字节开始,执行256次,保证每个字节都得到处理

加密算法工具 maven 加密算法实现_密码学_05

这样处理后的状态向量S几乎是带有一定的随机性了

4、最后是秘钥流的生成与加密。

加密算法工具 maven 加密算法实现_打开文件_06

具体实现代码如下:

RC4加解密算法

解密按照前面写的,异或两次就是原文,所以只要把密钥流重新拿过来异或一次就能得到原文了

 

RC4加密解密函数具体实现

具体实现代码见附件中的工程文件,此处展示部分运行结果。

需要加密的测试文件 test.txt为一篇由狗屁不通文章生成器生成的中文文章。共有35141个字节。

加密算法工具 maven 加密算法实现_密码学_07

加密算法工具 maven 加密算法实现_加解密_08

 

将test.txt放在工程目录下,然后对其进行加解密。

加密算法工具 maven 加密算法实现_打开文件_09

运行结果如图所示:

加密算法工具 maven 加密算法实现_密钥流_10

在文件目录下发现生成了两个新文件。

打开加密后的文件encrypted.txt查看,验证确实已经加密成功。

加密算法工具 maven 加密算法实现_加密算法工具 maven_11

打开解密后的decrypted.txt文件查看,与原test.txt文件一致,证明确实解密成功。

加密算法工具 maven 加密算法实现_加解密_12

 

RC4算法的速度测试

在代码中新增了一个测速模式的加密函数,打开文件后,该函数会记录下当前时间T1,加密后再次记录时间T2,随后算出时间差,即为加密的时间。

//测速模式下的加密函数

bool EncryptionSpeedMode(unsigned char* S, long size, char* file_name, int mode)//加解密文件 因为是对合运算,所以只需要一个函数,用mode控制加密还是解密

{

    FILE* pr;                      //定义读文件指针pr

    pr = fopen(file_name, "rb");    //只读

    time_t t1,t2;

    if (pr == NULL)                 //如果打开文件错误,则退出

    {

        printf("用户输入文件打开失败!\n");

        return false;

    }


    FILE* pw;                      //定义写文件指针pw

    unsigned char* data;                     //存储原始文件数据,并在运算过程中充当输出序列与原序列的异或结果   

    unsigned char i, j, temp;

    long num;

    data = (unsigned char*)malloc(size * sizeof(unsigned char));//分配内存


    //pw = fopen("", "wb");

    if (mode == 1)

        pw = fopen("encrypted.txt", "wb");    //模式为只写且刷新文件

    else

        pw = fopen("decrypted.mp4", "wb");    //模式为只写且刷新文件


    if (pw == NULL)                            //如果打开文件错误,则退出

    {

        printf("输出文件时出错!\n");

        return false;

    }

    fread(data, sizeof(char), size, pr);//读取二进制流(需要加/解密的文件)

    t1 = clock();//开始测速

    init_S();

    init_Key();

    permute_S();

    for (num = 0, i = 0, j = 0; num < size; num++) //逐位生成序列

    {

        temp = S[i];

        j = (j + temp) % 256;

        S[i] = S[j];

        S[j] = temp;

        temp = (temp + S[i]) % 256;

        data[num] ^= S[temp];

        i += 1;

    }

    t2 = clock();//结束测速


    fwrite(data, sizeof(unsigned char), size, pw);//写入二进制流

    printf("RC4算法的运行时间为%f ms\n", difftime(t2, t1));

    fclose(pw);//关闭文件流

    fclose(pr);

    free(data);//释放内存

    return true;

}

下面对一部大小为1269785091字节的视频文件进行加密解密

加密算法工具 maven 加密算法实现_加解密_13

运行结果如下

加密算法工具 maven 加密算法实现_密钥流_14

可以看到加密过程运行时间8100ms,解密过程运行时间8204ms。

打开解密后的decrypted.mp4,仍然可以播放

加密算法工具 maven 加密算法实现_密钥流_15

下面来计算RC4加密的速度:

1 269 785 091Byte / 8 100ms = 156 764 (Byte/ms)

通过换算 大概为157 MB/s。解密速度大致相同。