python对明文进行RSA加密
rsa加密是什么?
rsa加密是一种非对称的加密算法,就是加密秘钥和解密秘钥是不同的。用公钥进行加密,私钥进行解密。
加密:公钥 (e,n) 计算
解密:私钥(d,n)计算
python怎么进行加密?
从上面的图中可以知道,A对明文进行加密,需使用到B发送给A的公钥,那就先要获取到公钥。(公钥(e,n):e (Exponent)--指数;n(Modulus)—模数)
① 抓包看第一个请求的响应结果:有看到2个参数Exponent、Modulus。
但是这两个值都是字符串,我们需要的是两个整数。故要对它先进行转换。
② 字符串转换成十进制
import base64 import binascii e_str=base64.b64decode( 'AQAB' ) #返回解码后的二进制数据(文本字符串转换成二进制数据) m_str=base64.b64decode( 'AJONEgY58nD12OcAXv7P9UGPPsZOGLKj/IQjPf+gzyujHmXZoe3lFN1/PgxaqttzAAlC6DXgumvnyfjXc8csfkJz2oyaQiPMS2+TGipdZ1M3Rm1NlNO2K9yq8VeLFgZUhNCJTkS8RNoQ9pWT7EsAPGYINqmNh329Ltp/7JK7kyyl' ) print(m_str) print(e_str) m_hex = binascii.b2a_hex(m_str) #返回二进制数据的十六进制表示(二进制转换成十六进制) e_hex = binascii.b2a_hex(e_str) print(m_hex) print(e_hex) e= int (e_hex, 16 ) # 将 16 进制大端格式字符串转换为大整数(十六进制转换成十进制) n= int (m_hex, 16 ) print(e) print(n) |
1)Base64是一种用64个字符来表示任意二进制数据的方法。是一种最常见的二进制编码方法
方法 |
说明 |
|
---|---|---|
base64.b64encode(data) |
编码:二进制转换成文本字符串 |
|
base64.b64decode(string) |
解码:文本字符串转换成二进制 |
2) binascii模块包含很多用来方法来转换二进制和各种ASCII编码的二进制表示法。binascii二进制和ASCII转换
方法 |
说明 |
|
---|---|---|
binascii.a2b_base64(string) |
转换的base64数据块为二进制,并返回二进制数据。一次可以传递多行。 |
和base64.b64decode对应。 |
binascii.b2a_base64(data) |
转换二进制数据为一行base64编码的ASCII字符。返回字符串包含换行符。根据base64的标准data的长度最大为57。 |
和base64.b64encode对应。 |
binascii.b2a_hex(data)和binascii.hexlify(data) |
返回二进制数据的十六进制表示。每个字节被转换成相应的2位十六进制表示形式。因此,得到的字符串是是原数据长度的两倍。 |
|
binascii.a2b_hex(hexstr)和binascii.unhexlify(hexstr) |
从十六进制字符串hexstr返回二进制数据。是b2a_hex的逆向操作。 hexstr必须包含偶数个十六进制数字(可以是大写或小写),否则报TypeError。 |
3)int转换成整数 int(x, base=10)
-
x -- 字符串或数字。
-
base -- 进制数,默认十进制。
int(x)–不传入base,x必须是数字int(x,base=16)–x是字符串形式,是16进制表达式(16进制转换成2进制)
③ 获取到模数和指数后,生成公钥进行加密
from cryptography.hazmat.primitives.asymmetric import rsa,padding from cryptography.hazmat.backends import default_backend pubkey=rsa.RSAPublicNumbers(e,n).public_key(default_backend()) print(pubkey) key = pubkey.encrypt( 'abc12345' .encode( 'utf-8' ),padding.PKCS1v15()) #使用公钥对明文“abc12345”加密,返回加密后的二进制数据 print(key) print(binascii.b2a_base64(key)) #加密后的二进制转换成 字符串 |