Python实现RSA公钥加密算法

RSA公钥加密算法原理

1、RSA公钥加密算法属于非对称密码,因此有一对密钥,公钥和私钥,Ron Rivest, Adi Shamir和Len Adleman于1977年研制并于1978年首次发表;

2、RSA是一种分组密码,其理论基础是一种特殊的可逆模幂运算,其安全性基于分解大整数的困难性,即将两个大素数相乘非常容易,但是想对其乘积进行因式分解是十分困难的,因此将其乘积公开作为加密密钥(公钥)

3、对一个极大的整数做因数分解愈困难,RSA算法越可靠;

4、RSA既可用于加密,又可用于数字签名,已得到广泛采用;

5、RSA加解密过程图解如下:

6、RSA算法流程:

RSA算法的Python实现

PS:求幂次的模拟(mod)为平方乘的方法进行计算,未调用Python中的RSA包

1、程序如下:

import random
import binascii
import argparse # 导入读取命令行参数的模块
import sys sys.setrecursionlimit(100000) # 设置迭代次数限制 def main():
Build_key() # 生成公钥、密钥 parser = argparse.ArgumentParser(
description="This is a description, it includes the whole file's loactions of RSA algorithm.")
parser.add_argument('-p', required=True, type=argparse.FileType('r'), help='plainfile')
parser.add_argument('-n', required=True, type=argparse.FileType('r'), help='nfile')
parser.add_argument('-e', required=False, type=argparse.FileType('r'), help='efile') # e,d文件不是都要的,只需一个
parser.add_argument('-d', required=False, type=argparse.FileType('r'), help='dfile')
parser.add_argument('-c', required=True, type=argparse.FileType('w+'), help='cipherfile')
args = parser.parse_args() # args里面的成员是一个文件对象,所以后面写入文件的形式和一般的一样
n = int(args.n.read(), 16)
m = args.p.read() if m == '':
print('No PlainText!')
else:
print("Encrypting......")
e = int(args.e.read(), 16)
cipher = encrypt(m, e, n) with args.c as f:
f.write(cipher)
print("Encrypted!\r\nThe Cipher is:", cipher) c = cipher # 读取密文
if c == '':
print("No Cipher!")
else:
print("Decrypting......")
d = int(args.d.read(), 16)
plain = decrypt(c, d, n) print("Decrypted!\r\nThe PlainText is:", plain) # 平方—乘法,最后返回结果
def MRF(b, n, m):
a = 1 x = b
y = n
z = m binstr = bin(n)[2:][::-1] # 通过切片去掉开头的0b,截取后面,然后反转 for item in binstr:
if item == '1':
a = (a * b) % m
b = (b ** 2) % m elif item == '0':
b = (b ** 2) % m return a # 素性检验 def MillerRabin(n):
"利用Miller-Rabin算法检验生成的奇数是否为素数" m = n - 1
k = 0
while (m % 2 == 0):
m = m // 2 #m整除2
k = k + 1
a = random.randint(2, n)#生成随机数2<=a<=n
# b=a**m%n
b = MRF(a, m, n) #快速乘进行检验 if (b == 1):
return 1
for i in range(k):
if (b == n - 1):
return 1
else:
b = b * b % n
return 0 # 生成大素数,20次MillerRabin算法缩小出错的概率
def BigPrime():
Min = 10 ** 11 #**幂运算
Max = 10 ** 15
p = 0 while (1):
p = random.randrange(Min, Max, 1)#寻找min和max中的随机数p
#生成大素数p
for i in range(20):
if MillerRabin(p) == 0:
break
elif i == 19:
return p # 加密,传入公钥,通过读取明文文件进行加密
def encrypt(m, e, n):
cipher = ""
nlength = len(str(hex(n))[2:]) # 计算n的16进制长度,以便分组
message = m # 读取明文 for i in range(0, len(message), 8):#8个字节为一组
if i == len(message) // 8 * 8:
m = int(a2hex(message[i:]), 16) # 最后一个分组 m = int(a2hex(message[i:i + 8]), 16)
c = MRF(m, e, n)
cipher1 = str(hex(c))[2:] if len(cipher1) != nlength:
cipher1 = '0' * (nlength - len(cipher1)) + cipher1 # 每一个密文分组,长度不够,高位补0
cipher += cipher1 return cipher # 解密,传入私钥,通过文件读写进行解密
def decrypt(c, d, n):
# 加密之后每一个分组的长度和n的长度相同
cipher = c
message = ""
nlength = len(str(hex(n))[2:]) for i in range(0, len(cipher), nlength):
c = int(cipher[i:i + nlength], 16) # 得到一组密文的c m = MRF(c, d, n)
info = hex2a(str(hex(m))[2:])
message += info f_write("RSA_decrypted.txt", message)
return message # 求最大公因子
def gcd(a, b):
if a % b == 0:
return b
else:
return gcd(b, a % b) # 求逆元欧几里得辗转相乘法计算逆
def Ex_Euclid(x, n):
r0 = n
r1 = x % n if r1 == 1:
y = 1
else:
s0 = 1
s1 = 0
t0 = 0
t1 = 1 while (r0 % r1 != 0):
q = r0 // r1
r = r0 % r1
r0 = r1
r1 = r
s = s0 - q * s1
s0 = s1
s1 = s
t = t0 - q * t1
t0 = t1
t1 = t if r == 1:
y = (t + n) % n
return y # 写入文件
def f_write(filename, message):
f = open(filename, 'w')
f.write(message)
f.close() return 0 # ascii_to_hex
def a2hex(raw_str):
hex_str = ''
for ch in raw_str:
hex_str += hex(ord(ch))[2:] return hex_str # hex_to_ascii
def hex2a(raw_str):
asc_str = '' for i in range(0, len(raw_str), 2):
asc_str += chr(int(raw_str[i:i + 2], 16)) return asc_str def Build_key():
# 产生p,q,n,e,d
p = BigPrime()
q = BigPrime()
n = p * q
_n = (p - 1) * (q - 1) # n的欧拉函数
e = 0 while (1):
e = random.randint(1, _n + 1)
if gcd(e, _n) == 1:
break d = Ex_Euclid(e, _n)
# 写入文件
f_write('p.txt', str(hex(p))[2:])
f_write('q.txt', str(hex(q))[2:])
f_write('n.txt', str(hex(n))[2:])
f_write('e.txt', str(hex(e))[2:])
f_write('d.txt', str(hex(d))[2:]) if __name__ == "__main__":
main()

2、运行截图

3、加解密文件

AES加解密算法实现

AES加解密算法原理

1、AES算法由比利时密码学家Joan Daemen 和 Vincent Rijmen 提出;

2、AES算法的原型是Square算法,其设计策略是宽轨迹策略(Wide Trail Strategy),以针对差分分析和线性分析;

3、AES是迭代分组密码,其分组长度和密钥长度都是可变的;为了满足AES的要求,分组长度为128bit,密码长度为128/192/256bit,相应的轮数r为10/12/14;

4、算法流程图:

AES加解密算法Python实现

1、Python代码如下(PS:AES的实现是调用的Python中的AES包实现)

from Crypto.Cipher import AES
from binascii import b2a_hex
from binascii import a2b_hex
import sys
import binascii def encrypt(plain, iv, key):
if len(key) != 16 and len(key) != 24 and len(key) != 32:
print("[-] AES key must be 16/24/32 bytes long!")
return False
key = key.encode('utf8')
iv = iv.encode('utf8')
cryptos = AES.new(key, AES.MODE_CBC, iv)
ciphertext = cryptos.encrypt(plain.encode('utf8'))
return ciphertext def decrypt(ciphertext, iv, key): key = key.encode('utf8') #string->bytes
iv = iv.encode('utf8')
decrypto = AES.new(key, AES.MODE_CBC, iv)
plaintext = decrypto.decrypt(ciphertext) return plaintext if __name__ == "__main__":
plain = 'AESPython_Jody23'
iv = '12345678dc123478'
key = '0CoJUm6Qyw8W8jud'
ciphertext = encrypt(plain,iv,key)
print("Encrypt: ")
print(ciphertext)
plaintext = decrypt(ciphertext,iv,key)
print("Decrypt: ")
print(plaintext.decode('utf8'))

2、运行截图

参考文献

RSA,AES加解密算法的实现的更多相关文章

  1. JavaScript与C#互通的DES加解密算法的实现(转)

    本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DES解密算法将其解密 ...

  2. 简述前后端项目RSA+AES加解密

    一.登录机制 在项目中,我们可以大致得出一个登录的过程,主要分为  登录验证.登录保持.退出三个部分.登录验证是指客户端提供用户名和密码,向服务器提出登录请求,服务器判断客户端是否可以登录并向客户端确 ...

  3. C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密

    前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...

  4. DES,AeS加解密,MD5,SHA加密

    1.DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复, ...

  5. 收银台数据库存储AES加解密

    高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合.缺点是密钥的传输 ...

  6. .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转

    .net mvc 站点自带简易SSL加密传输   因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...

  7. aes加解密前后端-后台

    一.web.xml: <filter> <filter-name>fastLoginFilter</filter-name> <filter-class> ...

  8. c# Aes加解密和对象序列化

    aes加解密 public class AesCryptto { private string key = "hjyf57468jhmuist"; private string i ...

  9. Java、C#双语版配套AES加解密示例

      这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解 ...

随机推荐

  1. O - 推箱子 HDU - 1254(bfs_box + bfs_man)

    O - 推箱子 HDU - 1254 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能 ...

  2. Kafka监控:主要性能指标

    Kafka是什么? Kafka是一个分布式,有分区的,有副本的日志服务系统,由LinkedIn公司开发,并于2011年开源.从本质上来说,Kafka拥有一套可扩展的发布/订阅消息队列架构,并组成了一套 ...

  3. 在函数中修改全局变量的值,需要加global关键字

    一.引用 使用到的全局变量只是作为引用,不在函数中修改它的值的话,不需要加global关键字.如: #! /usr/bin/python a = 1 b = [2, 3] def func(): if ...

  4. 使用git上传代码到GitHub

    1.安装git git在Windows上安装很简单,在官网下载git的安装包后打开,然后一路next就好.安装完git之后,在文件夹中右击鼠标,出现Git Bash Here就表示安装完成了. 选择G ...

  5. Java反射(六)纯面向接口编程的简单框架实践

    我们知道在使用MyBatis开发时,只需要添加DAO接口和对应的映射XML文件,不需要写DAO的实现类,其实底层是通过动态代理实现. 本文将使用前几篇文章的知识点实现一个纯面向接口编程的简单框架,与M ...

  6. php数据库应用程序建议

    一.保持独立的读写连接 开始就创建两个数据库连接是一个好的方法,一个用于读取,一个用于写入,并且允许不同的数据库服务器连接他们.如果只有一个服务器,则将它们设置彼此相同. 当操作为INSERT, UP ...

  7. SI24R2F新一代2.4G超低功耗单发射有源RFID芯片 SI24R2E升级版智能充电安全管理方案首选

    目前全国有很多电动车因在充电时电池温度过高,而导致爆炸引起火灾的情况.作为国内RFID行业的推动者,动能世纪联合中科微向IOT应用领域推出新款大功率2.4G射频芯片,并针对电动车防盗.电动车充电桩市场 ...

  8. Vulnhub DC-1靶机渗透

    简介 DC-1靶机是为了入门渗透测试的人准备的入门级的靶机,该靶机共有5个flag,其中最后一个finalflag是真的flag,其他都是提示性flag.这个靶机虽然简单,但是还是能学到一些基本的思路 ...

  9. 记一次mysql多表查询(left jion)优化案例

    一次mysql多表查询(left jion)优化案例 在新上线的供需模块中,发现某一个查询按钮点击后,出不来结果,找到该按钮对应sql手动执行,发现需要20-30秒才能出结果,所以服务端程序判断超时, ...

  10. Python常见数据结构-字符串

    字符串基本特点 用引号括起来,单引号双引号均可,使用三个引号创建多行字符串. 字符串不可变. Python3直接支持Unicode编码. Python允许空字符串存在,不含任何字符且长度为0. 字符串 ...