密码技术实践——Python Crypto库源码解析(三)PublicKey模块概览
* 版权声明 *
引用请注明出处,转载请联系: h0.1c@foxmail.com
本文将探究Crypto.PublicKey模块,这个模块包括了公钥加密算法RSA、签名算法DSA和ElGamal算法的参数构造、加解密、签名验签的实现。
包含的主要内容有:
- RSA算法加密、解密、签名、验签的实现方法
- DSA算法及其参数要求
- DSA算法签名、验签的实现方法
- Crypto.PublicKey的模块结构
1 PublicKey模块文件列表
- _ init _ .py
- _DSA.py (legacy of DSA)
- _RSA.py (legacy of RSA)
- _slowmath.py
- DSA.py
- ElGamal.py
- pubkey.py
RSA.py
从这个文件结构可以大致了解,PublicKey模块主要包含以下几种算法:
- RSA,包括加解密、签名和验证
- DSA, 签名和验证
- ElGamal, 包括加解密、签名和验证
,而slowmath是用于计算算法中的数学问题的。
RSA算法在本系列第一篇文章中已经描述,点击连接可以跳转,这里不再赘述。
而DSA算法,作为一个以RSA和ElGamal为基础的数字签名算法,被美国NIST作为DSS (Digital Signature Standard, 数字签名标准),其问题复杂性是基于整数有限域离散对数问题,这一点和ElGamal一样。
2 PublicKey.pubkey
pubkey中定义了一个类:
class pubkey
内部基本是虚函数,例如
def encrypt(self, plaintext, K)
def decrypt(self, ciphertext)
def sign(self, M, K)
def verify (self, M, signature)
def validate (self, M, signature)
等,都留待不同算法分别继承并且实现,可以见得,PublicKey.RSA中的class _RSAobj、PublicKey.DSA中的class _DSAobj、PublicKey.ElGamal中的class ElGamalobj都是由pubkey继承而来,并且分别在内部实现了自身的各种算法。
3 PublicKey.RSA / PublicKey._RSA
先来说PublicKey._RSA这个legacy模块,这个模块中的内容很简单,除了上一篇文章中提到的参数生成模块generate_py(点这里跳转到该函数解析)之外,还有一个同样继承自pubkey的类class RSAobj,很明显,这个类已经被弃用了。
PublicKey.RSA中,就是上文提到的class _RSAobj和上一篇文章提到的class RSAImplementation。RSAImplementation主要负责导入密钥和生成密钥,而_RSAobj主要负责实现算法的各项功能(加密、签名等)。
但是实际上仔细查看_RSAobj,其实际上并没有直接实现算法的功能,以加密为例:
def encrypt(self, plaintext, K):
#中间一大段全是说明,没有代码
return pubkey.pubkey.encrypt(self, plaintext, K)
问题又回到pubkey类关于功能的实现了,查看pubkey对应的部分:
def<