本文简单实现了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;                      //定义读文件指针prpr = fopen(file_name, "rb");    //只读time_t t1,t2;if (pr == NULL)                 //如果打开文件错误,则退出{printf("用户输入文件打开失败!\n");return false;}FILE* pw;                      //定义写文件指针pwunsigned 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");    //模式为只写且刷新文件elsepw = 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。解密速度大致相同。

RC4加密解密算法原理及实现对文件的加解密相关推荐

  1. 非对称加密RSA算法原理及实际应用场景

    非对称加密RSA算法原理及实际应用场景 引言 应用场景 RSA 算法原理 数学基础 质数 欧拉定理 模指数运算 小白理解 为什么需要足够大的质数 引言 我数学差的离谱,所以我朋友去学AI,我还在这搞这 ...

  2. DES加解密算法原理详解与实现

    [DES密码编写] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 64 (3) softwa ...

  3. 国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

    国家医保移动支付国密算法SM2签名验签.SM4加解密DLL 支持医保移动支付(国家统一版), 已知省份有广西.贵州.安徽.河北.黑龙江.湖南.吉林.江苏.四川.新疆等各地方. DLL,非.net开发, ...

  4. android 文本 加密解密,Android文件简单加解密

    前言 在Android应用开发中,有时需要把一些内容以文件的方式保存到sdcard上,这时我们需要考虑数据的安全性,这就涉及到文件的加解密,这里简单介绍一种文件的加解密实现方法. 实现方案 我们在读写 ...

  5. 使用 Cipher CipherInputStream CipherOutputStream 实现对文件的加解密

    最近使用ftp对文件进行传输,而又担心文件安全问题,所以就此写了一个对文件加解密的工具,文件加密类型支持这三种DESede,Blowfish,AES 下面就不多说了,直接上code package c ...

  6. RSA加解密算法原理

    本文译自http://www.muppetlabs.com/~breadbox/txt/rsa.html,作者Brian Raiter. This article is translated from ...

  7. shiro 721 反序列化漏洞复现与原理以及Padding Oracle Attack攻击加解密原理

    文章目录 1. 前置知识 1.1 shiro550利用条件 原理 1.2 shiro721利用条件 原理 shiro-721对cookie中rememberMe的值的解析过程 1.3 基于返回包的sh ...

  8. python 3des加密_DES/3DES之ECB模式和CBC模式加解密 及 Python 实现

    概念说明 DES:Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法. 3DES:Triple DES,是三重数据加密算法(TDEA,Triple Data ...

  9. python3 rsa加密_python3产生RSA秘钥对并执行加解密操作详解

    加密使用的是公钥对数据进行加密,而且当你使用一把1024bit的rsa公钥的时候,你一次只能加密最多117byte的数据,如果数据量超过这个数,可能会涉及到对数据进行分段加密的问题.而且现在rsa 1 ...

最新文章

  1. 解决ORA-28000: the account is locked
  2. Mosquitto配置----日志设置
  3. spring定时器(@Scheduled)
  4. Python中的 // 与 / 的区别
  5. SAS 中计算总和或者计算总数的方法
  6. 一起谈.NET技术,ASP.NET 请求处理流程
  7. 神舟笔记本bios_海尔雷神(蓝天)神舟战神游戏本风扇狂转掉电大写灯狂闪维修实例...
  8. 吴恩达机器学习【第六天】神经网络模型
  9. UIKit 框架之UIControl
  10. 解决float型数据精度损失问题
  11. 帝国cms后台不停的登录成功
  12. Java源码分析之CountDownLatch
  13. AUTOCAD输出打印图片格式时空白
  14. 基于asp.net的大学生助学贷款管理系统
  15. 干货3分钟搞懂私募投资以及技术面试
  16. 行业标准 | 证券期货经营机构信息系统备份能力标准 JR/T 0059—2010
  17. 记录一下线上高并发情况下 SimpleDateFormat 出现异常问题【项目】
  18. matlab中axis函数程序,matlab中axis函数
  19. 作用域符号与成员访问符号_如何购买表情符号域
  20. Python基础语法七:元组字典和集合

热门文章

  1. 【实践报告】Linux基础实践一
  2. Xamarin Forms Custom Expander
  3. 如何解决rpm安装包依赖问题
  4. Android判断是否飞行模式已经监听飞行模式
  5. html里文字垂直对齐属性,word设置文本垂直对齐方式有几种
  6. 知识的价值在于交流和应用,《高效能人士的七个习惯(1第一部分_重新探索自我)》 Inber读书分享
  7. c++ 11标准模板(STL) std::vector (四)
  8. 颇为可惜,OPPO和vivo未能从华为身上占便宜
  9. Java字符串池西安尚学堂
  10. 数据可视化,我的数据分析成长之旅