事关RSA加密
事情是这样的,这几天在搞rsa加密, 于是研究了一下。本本将介绍非对称加密、python实现rsa加解密的方法、rsa的填充方法
非对称加密
相对比较安全,rsa 加密是非对称加密的一种。
原理:非对称加密依赖与明文经过与公钥进行数学运算可得出密文,而密文经过与密钥进行数学运算又可得到明文。
用途:非对称加密算法的优点是密钥分发简单,但缺点也是很明显的,其加解密过程依赖于数学运算运算量大所以加解密速度慢(另外同样的密钥强度其安全性弱于对称加密算法),其只适用于少量内容的加解密,最典型的就是https中用于完成对称密钥的交换(即openssl的rsa的加解密)。
拓展:https中的s是结合了对称加密(一个密钥)+非对称加密(公钥+私钥), 具体是:发送方将 对称加密的密钥 通过非对称加密发送接收方, 接收方通过非对称加密来解密,然后得到对称加密的密钥,然后再用对称密钥进行加密消息。
rsa的填充方法
1.RSA_PKCS1_PADDING 填充模式, 比钥模长(modulus) 短至少11个字节, 也就是 RSA_size(rsa) – 11
2.RSA_PKCS1_OAEP_PADDING,比钥模长(modulus) 短至少41个字节, 也就是 RSA_size(rsa) – 41
3.RSA_NO_PADDING , 和钥模长(modulus)一样长度
python实现rsa加解密的方法
1.使用 pycryptodome 包
pip3 install pycryptodome
from Crypto.PublicKey import RSA # 导入rsa
from Crypto.Cipher import PKCS1_OAEP # 导入填充模式
#加密
public_key = RSA.import_key(open("public.key","rb").read())
cipher = PKCS1_OAEP.new(public_key)
data = open("hello.txt", "rb").read() # 用二进制读取待加密文件
en_data = cipher.encrypt(data) # 输出为加密之后的二进制表示
#解密
private_key = RSA.import_key(open("private.key","rb").read())
cipher = PKCS1_OAEP.new(private_key)
encrypted_data = open("hello_de.txt","rb").read() # 待解密文件
data = cipher.decrypt(encrypted_data)
print(data.decode())
2.使用openssl加解密
根据公钥rsa_private_key 生成 加密数据test.txt.enc
openssl rsautl -in test.txt -out test.txt.enc -inkey rsa_public_key.pem -pubin -encrypt -pkcs
使用私钥rsa_private_key.pem对加密后的数据test.txt.enc进行解密,并将结果存放到text.txt.dec文件中:
openssl rsautl -in test.txt.enc -out test.txt.dec -inkey rsa_private_key.pem -decrypt -pkcs