RC4加密解密算法原理及实现对文件的加解密

    科技2024-12-19  9

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

    RC4加密解密算法的原理:

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

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

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

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

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

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

     

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

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

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

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

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

    具体实现代码如下:

    RC4加解密算法

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

     

    RC4加密解密函数具体实现

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

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

     

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

    运行结果如图所示:

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

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

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

     

    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字节的视频文件进行加密解密

    运行结果如下

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

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

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

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

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

    Processed: 0.030, SQL: 8