1. 简介
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
1.1 对称加密
OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。
这7种分组加密算法分别是:
AES、
DES、
Blowfish、
CAST、
IDEA、
RC2、
RC5,
它们都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。
其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。
事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。
1.2 非对称加密
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。
DH算法一般用于密钥交换。
DSA算法则一般只用于数字签名。
RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。
密钥
秘钥一般分为1对:公钥和私钥,
数据加解密: 私钥加密则公钥解密,一般会把公钥提供给客户方。
传输加解签:私钥加签,公钥解签。
2. RSA加解签、加解密(python版)
python依赖包: pip3 install rsa
import os
import base64
import rsa
class CryptoSign():
"""
1. 用公钥加密、再用私钥解密
2. 用私钥签名认证、再用公钥验证签名
"""
def __init__(self, fpathpri, fpathpub):
# 私钥
with open(fpathpri, 'rb') as f:
prikeydata = f.read()
self.privatekey = rsa.PrivateKey.load_pkcs1(prikeydata)
# 公钥
with open(fpathpub, 'rb') as f:
pubkeydata = f.read()
self.publickey = rsa.PublicKey.load_pkcs1(pubkeydata)
def get_sign_message(self, dict_map):
"""
Querystring 格式拼接
"""
d = sorted(dict_map.items(), key=lambda x: x[0])
list_l = []
for i in range(len(d)):
k, v = d[i]
if k in ["sign", "error_code", "error_msg"]:
continue
if v in [None, '']:
continue
if i == 0:
s = str(k) + "=" + str(v)
list_l.append(s)
else:
s = "&" + str(k) + "=" + str(v)
list_l.append(s)
content = ''.join([str(i) for i in list_l])
return content.encode('utf-8')
def sign(self, dict_map, hash_method='SHA-256'):
""" SHAxwithRsa算法 加签"""
message = self.get_sign_message(dict_map)
signature = rsa.sign(message, self.privatekey, hash_method)
sign = base64.b64encode(signature).decode('utf-8')
return sign
def sign_verify(self, dict_map, sign):
""" 验证签名 """
signature = base64.b64decode(sign)
message = self.get_sign_message(dict_map)
return rsa.verify(message, signature, self.publickey)
def pub_encrypt(self, data):
"""
私钥对数据加密
data must be byte string or string
return base64 string
"""
if isinstance(data, str):
data = data.encode('utf-8')
enc = rsa.encrypt(data, self.publickey)
ret = base64.b64encode(enc).decode(encoding='utf-8')
return ret
def pri_decrypt(self, data):
"""
公钥对数据解密
data must be base64 string
return string
"""
data = base64.b64decode(data)
return rsa.decrypt(data, self.privatekey)