RC4算法python编程实现
RC4于1987年提出,和DES算法一样。是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥)。
但不同于DES的是。RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每个字节。解密的时候也是依次对密文中的每个字节进行解密。
RC4算法的特点是算法简单,执行速度快。并且密钥长度是可变的,可变范围为1-256字节(8-2048比特),在现在技术支持的前提下,当密钥长度为128比特时,用暴力法搜索密钥已经不太可行,所以能够预见RC4的密钥范围任然能够在今后相当长的时间里抵御暴力搜索密钥的攻击。实际上,现在也没有找到对于128bit密钥长度的RC4加密算法的有效攻击方法。
RC4算法:RC4是一种对称密码算法,它属于对称密码算法中的序列密码(streamcipher,也称为流密码),它是可变密钥长度,面向字节操作的流密码。
RC4算法中的关键变量:
1、密钥流:RC4算法的关键是依据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是相应的。也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节。由于密文第i字节=明文第i字节^密钥流第i字节
2、状态向量S:长度为256。S[0],S[1].....S[255]。每一个单元都是一个字节。算法执行的不论什么时候。S都包含0-255的8比特数的排列组合,仅仅只是值的位置发生了变换;
3、暂时向量T:长度也为256,每一个单元也是一个字节。假设密钥的长度是256字节。就直接把密钥的值赋给T,否则,轮转地将密钥的每一个字节赋给T。
4、密钥K:长度为1-256字节。注意密钥的长度keylen与明文长度、密钥流的长度没有必定关系。通常密钥的长度趣味16字节(128比特)。
RC4算法加密流程:
包括密钥调度算法KSA和伪随机子密码生成算法PRGA两大部分(以密钥长度为256个字节为例)。
密钥调度算法:首先初始化状态矢量S,矢量S中元素的值被按升序从0到255排列,即S[0]=00, S[1]=1, …, S[255]=255.同时建立一个临时矢量T,如果密钥K的长度为256字节,则将K赋给T。否则,若密钥长度为keylen字节,则将K的值赋给T的前keylen个元素,并循环重复用K的值赋给T剩下的元素,直到T的所有元素都被赋值。
RC4的原理分为三步:
1、初始化S和T for i=0 to 255 do S[i] =i; T[i]=K[ I mod keylen ]; |
2、初始排列S for i=0 to 255 do j= ( j+S[i]+T[i])mod256; swap(S[i],S[j]); |
3、产生密钥流 for r=0 to len do i=(i+1) mod 256; j=(j+S[i])mod 256; swap(S[i],S[j]); t=(S[i]+S[j])mod 256; k[r]=S[t]; |
代码实现
cipher1=""
def get_message():fo = open("data.txt","r")s = fo.read()s=str(s)fo.close()return s
def get_message1():return cipher1
def get_key():print("输入你的秘钥:")key = input()if key == '':key = 'none_public_key'return key
def 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]return s_box
def ex_encrypt(plain,box,mode):"""利用PRGA生成秘钥流并与密文字节异或,加解密同一个算法"""if mode == '2':plain = plainres = []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)if mode == '1':fo=open("cipher.txt","wb+")# 化成可视字符需要编码print("加密后的输出:")print(cipher)#print(type(cipher))global cipher1cipher1 = ciphercipher = cipher.encode()fo.seek(0)fo.write(cipher)fo.seek(0)listsss=[fo.read(1) for i in range(100)]fo.close()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_message1()key = get_key()box = init_box(key)ex_encrypt(message, box, mode)else:print("输入有误!")
if __name__ == '__main__':while True:get_mode()
RC4算法python编程实现相关推荐
- 蚂蚁算法python_蚁群算法python编程实现
前言 这篇文章主要介绍了Python编程实现蚁群算法详解,涉及蚂蚁算法的简介,主要原理及公式,以及Python中的实现代码,具有一定参考价值,需要的朋友可以了解下. 蚁群算法简介 蚁群算法(ant c ...
- 维吉尼亚算法python编程实现
1 Virginia加密算法.解密算法 Vigenenre密码是最著名的多表代换密码,是法国著名密码学家Vigenenre发明的.Vigenenre密码使用一个词组作为密钥,密钥中每一个字母用来确定一 ...
- 独家 | 在Python编程面试前需要学会的10个算法(附代码)
作者:AnBento 翻译:陈超 校对:陈丹 本文长度为3300字,建议阅读10+分钟 本文为大家介绍了最近在Python编程面试中反复出现的10个基础算法问题,并且给出了相应的解答过程. Photo ...
- python编程思维代码_Python编程快速上手——强口令检测算法案例分析
本文实例讲述了Python强口令检测算法.分享给大家供大家参考,具体如下: 强口令检测 题目如下: 写一个函数,它使用正则表达式,确保传入的口令字符串是强口令.强口令定义:长度不少于8个字符,同时包含 ...
- python兔子编程_Python兔子生兔子算法,编程练习题实例十一
Python兔子生兔子算法,编程练习题实例十一 Python兔子生兔子算法,编程练习题实例十一 没学习python之前就听说过一个兔子生兔子的数学算法问题.现在学习了python编程后,自然要用pyt ...
- python兔子生兔子_Python兔子生兔子算法,编程练习题实例十一
没学习python之前就听说过一个兔子生兔子的数学算法问题.现在学习了python编程后,自然要用python语言来解决这个问题啦.Python编程练习题和答案实例十一,兔子生兔子的算法详解如下. P ...
- python画图、python小游戏、python刷题、python算法、python编程与数学
python画图系列整理 python画图系列整理-CSDN博客 python游戏入门书籍推荐 python游戏入门书籍推荐_pygame书籍推荐_dllglvzhenfeng的博客-CSDN博客 p ...
- Python编程:实现十进制转八进制的算法及完整源代码
Python编程:实现十进制转八进制的算法及完整源代码 在计算机科学中,我们通常会遇到需要将十进制数转换为其他进制的情况,在此我们以八进制为例,介绍如何使用Python代码实现将十进制数转换为八进制数 ...
- python学习之RC4算法实现
RC4算法 RC4算法是一种对称加密算法,即加密与解密的过程相同.假设其运算过程表示为rc4(key, data),其中key为密钥,data为待处理的数据,则: 密文=rc4(key,data) d ...
最新文章
- 常见硬件术语大全(上)
- Android调用前置摄像头的方法
- hpe服务器有哪些型号,HPE ProLiant DL80 Gen9 服务器 - 惠普服务器配置参数
- UA PHYS515A 电磁理论V 电磁波与辐射4 反射与折射
- SAP ABAP如何隐藏你写的程序代码(危险,请小心谨慎)
- python教程:Json模块中dumps、dump、loads、load函数用法讲解
- Python笔记(6)-输入输出
- Linux下配置和安装VNCServer远程服务
- Canvas事件绑定
- 西奥服务器修改楼层参数,西奥FOVF梯调试介绍.doc
- java excel导出 模板_Java Excel 导出 模板
- dijkstra最短路径算法视频_最短路径之Dijkstra算法详细讲解
- 查找算法之二分查找算法
- 移动硬盘显示要格式化怎么办
- python中tmp什么意思_python中tmp
- aws(亚马逊云服务)ssh登录提示Error establishing SSH connection to your instance. Try again later.
- 12月年末总结与新年期望
- 超级账本 —— 面向企业的分布式账本
- 实测中国版Afterpay:上市就被套现大军盯上,中介费率高达50%
- 金马公关为什么选择使用活字格来搭建《会议邀约系统》
热门文章
- CAD二次开发c#(三)简单的二、三维开发实例
- Java 设计模式之工厂方法模式
- python函数体以冒号起始、并且是缩进格式的_函数体以冒号开始,并且是缩进格式的。_学小易找答案...
- 休闲食品行业报告:渠道变革引领企业成长,连锁店业态前景广阔
- update case when 多字段,多条件, mysql中case when用法
- OpenCV之图像分割(五) 证件照背景替换
- CSS3 animation实现点点点loading动画
- 拓嘉启远:拼多多层级提高后有什么用?
- 中柏平板计算机价格,有什么便宜又好用的平板电脑?中柏EZpad i7看下
- 树莓派文件系统查看与清理垃圾箱