Python3简单实现RSA算法+密码学常用库的安装与使用

python3中的几个密码学函数库的安装与使用+RSA算法的简单实现

gmpy2库

0x01 安装wheel

1
pip install wheel

0x02 下载对应的gmpy2版本

首先查看自己的python版本

image-20210207191246780

进入下载网站https://www.lfd.uci.edu/~gohlke/pythonlibs/

这里我的版本是3.7.4 安装如下版本

image-20210207191538752

下载完成后保存本地,根据不同目录使用如下安装指令

1
pip install D:/gmpy2-2.0.8-cp37-cp37m-win_amd64.whl

0x03 gmpy2中的几个常用函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import gmpy2

gmpy2.mpz(a) 初始化大整数

gmpy2.gcd(a,b) 求a,b的最大公因数

gmpy2.invert(a,b) 求a模b的逆元

gmpy2.is_even(a) 检测a是否为偶数

gmpy2.is_odd(a) 检验a是否为奇数

gmpy2.is_prime(a) 检验a是否为素数

gmpy2.powmod(a,b,c) 求a的b次幂模c取余

gmpy2.iroot(a,b) 求a开b次根

libnum库

0x01 安装libnum

1
pip install libnum

注:此方法仅支持python3

0x02 libnum几个常用函数

1
2
3
4
5
6
7
8
9
import libnum

libnum.s2n() #字符串转数字

libnum.n2s() #数字转字符串

libnum.b2s() #二进制转字符串

libnum.s2b() #字符串转二进制

pycryptodome库

0x01 安装pycryptodome

1
pip install pycryptodome

附上官方文档

0x02 其中的常见库

1
2
3
4
5
6
7
8
9
10
11
常见对称密码在 Crypto.Cipher 库下,主要有:  DES 3DES AES RC4 Salsa20

非对称密码在 Crypto.PublicKey 库下,主要有: RSA ECC DSA

哈希密码在 Crypto.Hash 库下,常用的有: MD5 SHA-1 SHA-128 SHA-256

随机数在 Crypto.Random 库下

实用小工具在 Crypto.Util 库下

数字签名在 Crypto.Signature 库下

0x03 几个实用的算数函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from Crypto.Util.number import *

GCD(11,143) # 最大公约数

bytes_to_long(b'hello') # 字节转整数

long_to_bytes(0x41424344) # 整数转字节

getPrime(16) # 返回一个最大为Nbit的随机素数

getStrongPrime(512) # 返回强素数

inverse(10,5) # 求逆元

isPrime(1227) # 判断是不是素数

RSA算法的原理与python简单实现

RSA生成公私密钥对的步骤

0x01

随机选取两个不相等的素数p和q(当选取的数越大,安全性越高)

0x02

计算p和q的乘积n

n的二进制长度就是密钥的长度

0x03

计算欧拉函数phi

phi=(p-1)*(q-1)

0x04

随机选取一个整数e

条件为:1<e<phi 且 e与phi互质即最大公约数为1

0x05

计算e对于phi的模反元素d

即满足e*d ≡ 1 (mod phi)

0x06

公钥对为 e,n

私钥对为 d,n

RSA加密算法:c=m^e mod n

RSA解密算法:m=c^d mod n

其中c为密文,m为明文

代码简单实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import gmpy2
import libnum
from Crypto.Util.number import *

p=getPrime(64)
q=getPrime(64)#随机生成64位的素数p和q
n=p*q
phi=(p-1)*(q-1)
e=65537 #e通常取65537
d=gmpy2.invert(e,phi)

m="flag{hello_word}" #明文为字符串
c=gmpy2.powmod(libnum.s2n(m),e,n) #利用libnum将字符串转为数字
en=gmpy2.powmod(c,d,n)
print(long_to_bytes(en)) #解密后的明文为数字形式,再将数字转为字符串

运行结果如下

image-20210207233525858


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!