用Python实现RSA签名和验签
2018-01-10 17:23
344 查看
唠叨两句,蹭点篇幅
RSA是一种非对称加密算法,简单理解就是两个密钥:一个公钥,一个私钥。同时它也可以用来签名和验签,正好与加密相反。
加密:公钥加密,私钥解密;
签名:私钥签名,公钥验签。
有意思的是有些人分不清公钥私钥的用处,这里提供一个思路:
用作加密时,密文泄露是无所谓的(相对而言),重要的是用于解密的密钥必须安全,所以用不公开的私钥来解密,用公钥来加密;
用作签名时,目的是防止别人伪造我的身份发信息,所以用私钥来签名,用公钥来验签。
对于加密及签名的讲解,看过一篇很棒的翻译,看完过后非常有助于理解,并且图文并茂,很生动:
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
一、签名
话不多说,直接贴代码:from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 from Crypto.Hash import MD5 import base64 def RSA_sign(encrData): privateKey = '''MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOG/8J9TP8cN7upNoZ+LoBs9xImv 4hHAwO/gq7TLGjZ5IoUIxWPJbGtUI+muXsFf8tBfjE3p86ava1R1Ji0c0Sh98bPT4lFMqGFWV5OJ d2VbvLGG4DclFzkZxMuB4M7sSvXlKdfawHuFFG/HiEEzjuiROfqWlP3qZ6Ix0QLRhE9HAgMBAAEC gYBdPujnBn3rfIfY4+QEgKnLVsIdlTat2o5XBtglv1a+dV6a0LqnswVDd+e1mD6vZTBofW74p8/q Y77TjegM7kA90Nw9N4z2uuhn7kXFNI+RiA2MUXcqf4Vwb/64wRpqH70abZzCuyhxQYXqNqEmJuL4 jAxMoxztxj4BvXt5zk9ekQJBAPLwghERrLNgu+ty/Fmdk15NWE/Eoazig15THPEgrZ5Ruaq90U9O 4sTWbYgDLYJI75uDTgFoPE+VHkT40WspYZMCQQDt4tsPwVHtXEX4sYclEAbWzXEYDlNXCA3zvWf6 9cb9N+oY4FfMuThFdfpC5H2D+5bhqCRLZUzuvthS7i18ljv9AkEApJkFVvFFtIc+60iN513XAhaf VfRgohUacqcXPdwpJdIzXJadIQHOrRSnQ3b7t4EZLqFpEZUA/96Fkq+Om+9+lwJBAK0fjwt9RrF2 mNmv4UnAyyliZC78pfxNuVGsg1LpsYKxQaYPBvbPyTsL7DDodswpuhnJs3hHZeDOdUKNYf8smsUC QDhQqQHjf6Kf9ZI/zO6Ldvn0y5cMomzfFaH8ltRcjuNB8num1Vt0Oyk+k90q+OYak5twRvKGGsQD 8v+gOIQ8ZfA=''' private_keyBytes = base64.b64decode(privateKey) priKey = RSA.importKey(private_keyBytes) #priKey = RSA.importKey(privateKey) signer = PKCS1_v1_5.new(priKey) hash_obj = MD5.new(data.encode('utf-8')) signature = base64.b64encode(si 4000 gner.sign(hash_obj)) return signature
几个注意事项:
1、密钥如果是读取自.pem文件,密钥会有开始行和结束行,叫做头标注信息和尾标注信息。常见的长这样:
'''-----BEGIN PRIVATE KEY----- #密钥内容# -----END PRIVATE KEY-----'''
此时直接
priKey = RSA.importKey(privateKey)(见被注释掉的部分)即可,不用对私钥进行base64解码;
2、哈希算法可以采用MD5,也可以用别的比如SHA;
3、data是需要签名的数据,需要字节化后才能传进
MD5.new()中。字节化有三种方法,示例中采用了第三种:
b'zifuchuang'
bytes('zifuchuang',encoding='utf-8')
'zifuchuang'.encode('utf-8')
二、验签
def verify(signature,encrData): publicKey = '''MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ3haUf1Tj0/XuknJqsxg/N8nu3NqXhvo6Mdbw UFuLYux0pjKlY2lCvV14Rlnl2bf0XoIaFcHZIvbexv8bXfakDhpQokyToKvK6kIlbkgKCqCzjVm0 ZthNou5cnqVyRurn3UXxELn1VfHkLc4nSZie+pMwiBRB4ViuAH1+w/gyvwIDAQAB''' public_keyBytes = base64.b64decode(publicKey) pubKey = RSA.importKey(public_keyBytes) #pubKey = RSA.importKey(publicKey) h = MD5.new(data.encode('utf-8')) verifier = PKCS1_v1_5.new(pubKey) return verifier.verify(h, base64.b64decode(signature))
注意事项:
1、因为签名时我们对
RSA_sign()返回的签名值进行过过base64编码,所以验签时需要解码;
2、函数
verifier.verify()返回的是bool值,在外层可以直接用作条件判断。
三、后话
其实RSA更广泛的用法是加密,懒癌发作,以后再搞吧,因为要讲的东西实在是蛮多的-。-相关文章推荐
- python实现aes加密解密,RSA签名和验签,RSA加密解密,并调用接口
- python实现aes加密解密,RSA签名和验签,RSA加密解密,并调用接口
- Python下实现的RSA加密/解密及签名/验证功能示例
- Python 实现RSA SHA-1签名
- java/php/c#版rsa签名以及验签实现
- C#中RSA加密解密和签名与验证的实现
- java/php/c#版rsa签名以及java验签实现openssl生成
- C#中RSA加密解密和签名与验证的实现
- 前端js,后台python实现RSA非对称加密
- Python GUI--Tkinter简单实现个性签名设计
- python下RSA 加密/解密,签名/验证
- 非对称加密技术RSA详解(python实现版本)
- C#中RSA加密解密和签名与验证的实现
- Python GUI Tkinter简单实现个性签名设计
- 调用OpenSSL实现RSA加解密和签名操作
- C#中RSA加密解密和签名与验证的实现
- Python下RSA加密/解密, 签名/验证
- PHP实现RSA签名生成订单功能【支付宝示例】
- C#实现RSA加密与解密、签名与认证
- Python对PHP服务器hmac_sha1签名认证方法的匹配实现