简介

RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,一个字节一个字节地加密。因此也属于对称加密算法。突出优点是在软件里面很容易实现。

加密流程

包含两个处理过程:一是秘钥调度算法(KSA),用于之乱S盒的初始排列,另外一个是伪随机数生成算法(PRGA),用来输出随机序列并修改S的当前顺序。

  1. 根据秘钥生成S盒
  2. 利用PRGA生成秘钥流
  3. 秘钥与明文异或产生密文

单个点拿出来分析

根据秘钥生成S盒

初始化S盒

直接构造一个S[256],遍历0-255,然后创建临时T[256],用于存储种子秘钥,长度不够循环填充直到T被填满,根据T[i]将S[i]与S中的另外一个字节对换,对S的操作仅仅是交换,唯一改变的是位置,但里面的元素是没变的还是0-255

    s_box = list(range(256)) #我这里没管秘钥小于256的情况,小于256不断重复填充即可j = 0for i in range(256):j = (j + s_box[i] + ord(key[i % len(key)])) % 256s_box[i], s_box[j] = s_box[j], s_box[i]#print(type(s_box)) #for_testreturn s_box

下图很好的解释了S盒被随机化的过程

利用PRGA生成秘钥流

从S盒选取一个元素输出,并置换S盒便于下一轮取出,选取过程取决于索引i和j,这也体现了在加密过程中S盒会变化。下面的是流程:

    res = []i = j =0for s in plain:i = (i + 1) %256j = (j + box[i]) %256box[i], box[j] = box[j], box[i]t = (box[i] + box[j])% 256k = box[t]res.append(chr(ord(s)^k))  #直接与每一个字节明文相异或

秘钥与明文异或产生密文

至于这一点就不用多说了,由于异或运算的对合性,RC4加密解密使用同一套算法。

python实现:

# -*- coding: utf-8 -*-
# Author:0verWatchimport base64def get_message():print("输入你的信息:")s = input()return sdef get_key():print("输入你的秘钥:")key = input()if key == '':key = 'none_public_key'return keydef init_box(key):"""S盒 """s_box = list(range(256)) #我这里没管秘钥小于256的情况,小于256应该不断重复填充即可j = 0for i in range(256):j = (j + s_box[i] + ord(key[i % len(key)])) % 256s_box[i], s_box[j] = s_box[j], s_box[i]#print(type(s_box)) #for_testreturn s_boxdef ex_encrypt(plain,box,mode):"""利用PRGA生成秘钥流并与密文字节异或,加解密同一个算法"""if mode == '2':while True:c_mode = input("输入你的解密模式:Base64 or ordinary\n")if c_mode == 'Base64':plain = base64.b64decode(plain)plain = bytes.decode(plain)breakelif c_mode == 'ordinary':plain = plainbreakelse:print("Something Wrong,请重新新输入")continueres = []i = j =0for s in plain:i = (i + 1) %256j = (j + box[i]) %256box[i], box[j] = box[j], box[i]t = (box[i] + box[j])% 256k = box[t]res.append(chr(ord(s)^k))cipher = "".join(res)#print(cipher)if  mode == '1':# 化成可视字符需要编码print("加密后的输出(没经过任何编码):")print(cipher)# base64的目的也是为了变成可见字符print("base64后的编码:")print(str(base64.b64encode(cipher.encode('utf-8')),'utf-8'))if mode == '2':print("解密后的密文:")print(cipher)def get_mode():print("请选择加密或者解密")print("1. Encrypt")print("2. Decode")mode = input()if mode == '1':message = get_message()key = get_key()box = init_box(key)ex_encrypt(message,box,mode)elif mode == '2':message = get_message()key = get_key()box = init_box(key)ex_encrypt(message, box, mode)else:print("输入有误!")if __name__ == '__main__':while True:get_mode()

安全性

  1. 由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。所以必须对加密密钥进行测试,判断其是否为弱密钥。
  2. 当然,现在RC4已经不安全了,可以参考这篇文章,破解RC4现在是具有很高效率的。

RC4原理以及Python实现相关推荐

  1. RC4原理及其Python的实现

    1. 背景与历史 RC4是一种流加密法,这意味着,其加密是逐个字节进行的,但也可以改为逐位加密或者是除字节/位之外的大小. RC4已经成为某些被广泛使用的加密技术和标准的一部分,包括无线设备隐私.用于 ...

  2. python gdbt+fm_GBDT回归的原理及Python实现

    提到GBDT回归相信大家应该都不会觉得陌生(不陌生你点进来干嘛[捂脸]),本文就GBDT回归的基本原理进行讲解,并手把手.肩并肩地带您实现这一算法. 完整实现代码请参考本人的p...哦不是...git ...

  3. 手把手教你EMD算法原理与Python实现(更新)

    Rose今天主要介绍一下EMD算法原理与Python实现.关于EMD算法之前介绍过<EMD算法之Hilbert-Huang Transform原理详解和案例分析>, SSVEP信号中含有自 ...

  4. 信号处理之频谱原理与python实现

    目录 频谱分析 FFT频谱分析原理 下面就用python案例进行说明 案例1 案例2 短时傅里叶变换STFT 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区.QQ交流群:941473018 ...

  5. 倒频谱原理与python实现

    目录 倒频谱定义 倒频谱python案例 本教程为脑机学习者Rose发表于公众号:脑机接口社区 .QQ交流群:903290195 倒频谱定义 倒频谱可以分析复杂频谱图上的周期结构,分离和提取在密集调频 ...

  6. 冲量(momentum)的原理与Python实现

    冲量(momentum)的原理与Python实现 前言 参考:https://www.jianshu.com/p/58b3fe300ecb 梯度下降法(Gradient Descent)是机器学习中最 ...

  7. python实现逻辑回归的流程_逻辑回归原理及其python实现

    September 28, 2018 7 min to read 逻辑回归原理及其python实现 原理 逻辑回归模型: $h_{\theta}(x)=\frac{1}{1+e^{-{\theta}^ ...

  8. 典型相关分析(cca)原理_CCA典型关联分析原理与Python案例

    文章来源于"脑机接口社区" CCA典型关联分析原理与Python案例​mp.weixin.qq.com Rose今天分享一下CCA的相关原理以及Python应用,CCA在EEG等脑 ...

  9. python kmeans聚类 对二维坐标点聚类_Kmeans均值聚类算法原理以及Python如何实现

    第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给定两个质心,我们这个算法的目的就是将这一堆点根据它们自身的坐标特征分为两类,因此选取了两个质 ...

最新文章

  1. dataframe在特定列 插入_DataFrame在任意处添加一列或者多列的方法
  2. php 自动签到源码,我也来发个自动签到脚本,PHP版
  3. matlab绘制星下点轨迹,MATLAB绘制GPS星下点轨迹图
  4. eclipse创建spring boot项目,tomcat启动成功,但http://localhost:8080无法访问报错404解决方案...
  5. dedecms设置端口号_织梦程序使用宝塔面板端口修改方法
  6. 群晖218J搭建VLMCSD
  7. php换脸,ps如何给人物换脸?ps人物换脸教程
  8. 小技巧 - Chrome 浏览器绕过“请在微信客户端打开链接”
  9. 【报告分享】2020年K12在线教育行业广告策略用户调研报告(附下载)
  10. 逆战GOGO之微信小程序—点击商品列表进入详情页面
  11. 驱动对象处理-狂人楚
  12. 服务器端获取签名直传OOS
  13. 大数据分析师·人才培养·高薪起航
  14. git操作后的各种后悔情况解决
  15. Python爬取分析动漫之家订阅量最多的漫画的标签
  16. python+selenium实现网易邮箱登陆
  17. 分享8个强大的黑客技术学习网站
  18. 翡翠戒指行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  19. 干货 | 科研决策怎么做?四个步骤一招解决!
  20. 做好企业微信运营,为什么要使用微盛·企微管家?

热门文章

  1. 工信部通报今年首批问题App 当当、1药网私自收集个人信息 被通报的16款App名单
  2. html移动端注册流程,登录和注册移动端.html
  3. 免费生成微信小程序的经验
  4. html 在线测试 鱼缸,五大浏览器功耗(电量消耗)测试:IE9领先
  5. ClassName::class
  6. %2d, %02d, %d的区别
  7. MFC ---- CString
  8. 什么是高并发,高并发的解决方案
  9. input 禁止弹出默认的键盘处理方法
  10. echarts自定义区域地图