导师让将隐私求交项目中的使用的原始RSA库替换成另外一个,于是调研了一番两者使用方式。由于两个库为了安全性,加密时都采用了非确定性加密,即对相同的输入,即使是相同的key也会产生不一致的加密结果。而当前项目需要确定性加密,我将在后面的博客介绍自己重新实现的确定性RSA算法。
cryptography
使用流程
- Key生成,产生私钥(用于签名、解密,只支持sign/decrypt方法)=> 产生公钥(用于验证、加密)
- 传输公钥 & 加密/签名信息
- 对方:
- 数字签名:私钥签名,传输签名和原文,对方用【公钥+签名+原文】进行验证
- 解密:对方用公钥加密传输密文,自己用私钥解密密文
出于安全性,提供的加密算法为非确定性加密,由padding参数指定,只支持两种。
Valid paddings for encryption are
OAEPandPKCS1v15.OAEPis the recommended choice for any new protocols or applications,PKCS1v15should only be used to support legacy protocols.
对于数字签名,提供的padding也只支持两种。
Valid paddings for signatures are
PSSandPKCS1v15.PSSis the recommended choice for any new protocols or applications,PKCS1v15should only be used to support legacy protocols.
参考加密方法
ciphertext = public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
默认采用OAEP方式填充,会填充一段随机字符串,使得串长达到key的长度。对于该接口,产生的ciphertext 不唯一。
rsa
使用流程
使用方法与cryptography类似。
Key生成有更多的参数,poolsize指定并行线程数,accurate=False产生更弱的key加速运算。
提供的加解密/签名为函数式调用,公钥和私钥作为参数。
# 加密和解密
# message from Alice to Bob
crypto = rsa.encrypt(message, bob_pub)
message = rsa.decrypt(crypto, bob_priv)
# 签名和验证
signature = rsa.sign(message, privkey, 'SHA-1')
rsa.verify(message, signature, pubkey)
其他接口
1)大文件加密
对于大文件进行RSA加密比较慢,rsa官方提供的解决方案是,对原文进行对称加密,而对密钥再用RSA加密传输。或者使用VARBLOCK,但这个接口不被推荐。
对较大的文件使用RSA最常见的方法是使用AES或DES3等块密码,用随机密钥加密文件,然后用RSA加密随机密钥。您将把加密的文件和加密的密钥一起发送给收件人。
2)核心模块
rsa提供了对于整数进行RSA的接口,即 rsa.core.encrypt_int 和 rsa.core.decrypt_int。