RC4算法

RC4算法是一种对称加密算法,即加密与解密的过程相同。假设其运算过程表示为rc4(key, data),其中key为密钥,data为待处理的数据,则:

密文=rc4(key,data)
data=rc4(key,密文)

也就是说,对一段数据(原文)做奇数次RC4运算,得到密文,做偶数次RC4运算,结果还是原文。

RC4算法是基于密钥流的加密算法。
假设要加密的数据(明文)长度为N个字节,通过某种算法产生N字节的数据(密钥),将这两串数据按位异或(XOR),得到密文。把密文与这串密钥再XOR,就能得到明文。这一串由某种算法产生的N字节(8N位),称为密钥流,对应算法就叫做密钥流生成算法。区分不同基于密钥流的加密算法的标准就是其密钥流的生成方式。

算法特点
简单,运行速度快,密钥长度可变(长度范围为 1-256 字节)。

RC4算法组成:

1、S盒生成
根据用户输入的秘钥 key,使用 密钥调度算法(key-scheduling algorithm,KSA)生成 S 盒。

2、生成密钥流,加密数据
使用伪随机生成算法(Pseudo-random generation algorithm,PRGA)生成秘钥流,然后使用生成的密钥流加密明文数据,得到密文。

对应得到的密文,可以根据需要再做处理,例如base64编码。

这里需要注意的是,对于包含中文的明文,需要做适当的编码(encode)和解码(decode)处理,编码方法一般为“utf-8”,同时还涉及字符转ascii编码(10进制)等操作。

算法实现

可以通过导入Crypto.Cipher中的ARC4来实现,也可以自定义实现,本文通过自定义方法实现。

代码运行环境:
windows 10
python 3.7

# coding=utf-8
# python 3.7import sysdef bytesToHex(bytes):sb = ''for i in range(len(bytes)):hexs = hex(bytes[i] & 0xFF)[2:]if len(hexs) < 2:sb += '0'sb += hexsreturn sbdef hexToByte(inHex):hexlen = len(inHex)result = []if (hexlen % 2 == 1):hexlen += 1inHex="0"+inHexfor i in range(0, hexlen, 2):result.append(int(inHex[i:i+2],16))return resultdef initKey(aKey):state = list(range(256))bkey =[ord(i) for i in list(aKey)]index1 = 0index2 = 0if (len(bkey) == 0):return []for i in range(256):index2 = ((bkey[index1] & 0xff) + (state[i] & 0xff) + index2) & 0xffstate[i], state[index2] = state[index2], state[i]index1 = (index1 + 1) % len(bkey)return statedef RC4Base(input, mKkey):x = 0y = 0key = initKey(mKkey)result = list(range(len(input)))for i in range(len(input)):x = (x + 1) & 0xffy = ((key[x] & 0xff) + y) & 0xffkey[x], key[y] = key[y], key[x]xorIndex = ((key[x] & 0xff) + (key[y] & 0xff)) & 0xffresult[i] = (input[i] ^ key[xorIndex])return resultdef encryRC4Byte(data, key, chartSet='utf-8'):if not chartSet:bData = [ord(i) for i in data]return RC4Base(bData, key)else:bData = list(data.encode(chartSet))return RC4Base(bData, key)def decryRC4(data, key, chartSet='utf-8'):r = RC4Base(hexToByte(data), key)return bytes(r).decode(chartSet)def encryRC4String(data, key, chartSet='utf-8'):return bytesToHex(encryRC4Byte(data, key, chartSet))def main(data, key, signs):if signs == 'encode':datas = encryRC4String(data, key)else:datas = decryRC4(data, key)print(datas)if __name__ =='__main__':try:key = sys.argv[2] #"key"data = sys.argv[1] #"encoded_string"choices=sys.argv[3].strip() # decode or encodeif choices not in ['decode', 'encode']:print('usage: %s string2decode key_string decode' % sys.argv[0])print('   or: %s string2encode key_string encode' % sys.argv[0])exit()except:print('usage: %s string2decode key_string decode' % sys.argv[0])print('   or: %s string2encode key_string encode' % sys.argv[0])exit()main(data,key,choices)

使用方法很简单,需要的参数共3个,第一个data参数为明文或密文,第二个参数key为密钥,第三个choices为加密(encode)或者解密(deocde)操作,假设代码保存为rc4.py文件,在命令行中执行:

python rc4.py dsadasMI明文  thisiskey encode

得到密文:efc3c7d2cb1ffc0b1fd84d6f000b 。

进行解密:

python rc4.py efc3c7d2cb1ffc0b1fd84d6f000b  thisiskey decode

得到明文: dsadasMI明文 。

python学习之RC4算法实现相关推荐

  1. Python学习教程之算法讲解:深入浅出Apriori关联分析算法

    在美国有这样一家奇怪的超市,它将啤酒与尿布这样两个奇怪的东西放在一起进行销售,并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加.这家超市的名字叫做沃尔玛. 你会不会觉得有些不可思议?虽然事 ...

  2. Python学习——K近邻算法

    K-近邻算法介绍 K-近邻算法步骤 为了说明算法步骤,这儿引用一个实例 电影名称 打斗镜头 暧昧镜头 电影类型 泰坦尼克号 3 104 爱情片 那些年 2 100 爱情片 七月与安生 1 81 爱情片 ...

  3. AI火爆干货最全整理!五套深度学习和算法学习教程和三套Python学习视频!!!限时无套路免费领取!...

    点击蓝色"AI专栏"关注我哟 选择"星标",重磅干货,第一时间送达 这是站长第 31 期免费送丰富宝贵的干货资源与教程 本期绝对是满满的干货! 获取更多资源请关 ...

  4. 【Python学习教程】数据结构与算法

    前言 python内置的数据结构包括:列表(list).集合(set).字典(dictionary),一般情况下我们可以直接使用这些数据结构,但通常我们还需要考虑比如搜索.排序.排列以及赛选等一些常见 ...

  5. Python学习,python实现七个基本算法

    1.顺序查找 当数据存储在诸如列表的集合中时,我们说这些数据具有线性或顺序关系. 每个数据元素都存储在相对于其他数据元素的位置. 由于这些索引值是有序的,我们可以按顺序访问它们. 这个过程产实现的搜索 ...

  6. 【强化学习】Sarsa算法详解以及用于二维空间探索【Python实现】

    Sarsa算法 Sarsa算法,是基于Q-Learning算法.改动其实很小. 本文工作基于之前的Q-Learning的项目,如果有疑问可以看下面两个问题: [强化学习]Q-Learning算法详解以 ...

  7. Python预测 数据分析与算法 学习笔记(特征工程、时间序列)

    微信公众号:数学建模与人工智能 GitHub - QInzhengk/Math-Model-and-Machine-Learning 第3章 探索规律 3.1 相关分析 相关关系是一种与函数关系相区别 ...

  8. Python - RC4 算法

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/max229max/article/details/87607302 Python - RC4 算法 ...

  9. 【强化学习】Q-Learning算法详解以及Python实现【80行代码】

    强化学习 在文章正式开始前,请不要被强化学习的tag给吓到了,这也是我之前所遇到的一个困扰.觉得这个东西看上去很高级,需要一个完整的时间段,做详细的学习.相反,强化学习的很多算法是很符合直观思维的. ...

最新文章

  1. 90%的人会遇到性能问题,如何用1行代码快速定位?
  2. 入门讲解HTML5的画布功能(1)
  3. Kubernetes(五) - Service
  4. python 程序停止打印日志_优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止!
  5. C和指针之字符串编程练习8实现char *my_strnchr(char const *str, int ch, int which)
  6. linux系统中文件的特性,linux文件系统特性
  7. sql server无法绑定由多个部分组成的标识符_HTML5服务器推送事件(Server-sent-event)...
  8. 2018-04-26java实习面试记录
  9. itools苹果录屏大师_如何录制ZOOM视频会议?实用的录屏软件
  10. PyCharm怎么来更新pip
  11. 如何有效回复审稿人的意见
  12. VS 报错error C3872: “0xa0”: 此字符不允许在标识符中使用
  13. 【通俗易懂的通信】信道编码之——汉明码
  14. 防止电脑辐射的最好方法
  15. Mac程序坞中软件删除出现残留“?”图标无法删除解决方法:
  16. 与朱元思书(南朝 梁 吴均)
  17. Unity中暂停、继续播放、杀死、正放、倒放Dotween动画
  18. 【Vue】9 - 组件(全局、局部)、通信(props、$meit、$refs)、插槽slot、component、$nextTick等
  19. 嵌入式开发必备!Arm Development Studio 安装说明
  20. overflow第一次觉得你有点可恶

热门文章

  1. 负面漩涡中的二手车平台,原本有着另一副面孔
  2. node判断某一端口是否被占用
  3. c#.net 获取时间日期年月日时分秒格式(转)
  4. 今天收到《新程序员》杂志,忽然发现在CSDN账号注册已经21年了!
  5. vue中vue.runtime.esm.js?2b0e:619 [Vue warn]: data functions should return an object:报错原因
  6. 9.3 挂钩API技术(HOOK API)
  7. IOS - 一键删除!拒绝苹果日历被垃圾信息骚扰
  8. 2020中国建设银行信息技术岗提前面试经历
  9. 在汉化新世纪论坛针对恶意插件的发言
  10. 非因快讯 | 非因生物再次受邀参加TBM线上医研企合作座谈会