python2如何使用M2Crypto对接口请求的数据加密,对接口请求的数据解密

RSA加密算法是一种强大的公钥加密算法,安全性很高,这里我们来看一下Python使用Pycrypto库进行RSA加密的方法详解

Python密码库--Pycrypto
Python良好的生态,对于加密解密技术都有成熟的第三方库。大名鼎鼎的M2Crypto和Pycrypto,前者非常容易使用,可是安装却非常头疼,不同的系统依赖软件的版本还有影响。后者则比较方面,直接使用pip安装即可。

安装  (切记只可在mac系统或者linux系统上安装,win系统不支持该库)

pip install pycrypto

安装成功后:pip list

测试环境以上参数分别为渠道Id:000****,apiKey:0000****, 公匙:
FwwDQY************JAAQ==  
  

所有接口需要在请求头中添加sign头信息,以验证此次请求的身份,sign的制作规则如下 : 

1、请求的所有非空参数按照自然序排序后以key=value的形式&连接,如:String sign = key1=value1&key2=value2&key3=value3。

2、将1中得到的字符串最后拼接上apiKey,如:sign = sign + "&apiKey=" + apiKey(申请得到)。

3、将2中得到的sign值用RSA算法的公匙加密进行加密,将得到的加密字符作为sign头信息的value值,加密注意事项见下一条。

RSA加密注意事项:

1、加解密方式按照RSA非对称算法进行。加解密用的byte[]应该用java.util.Base64进行运算,加密时将加密得到的byte[]进行
  Base64.getEncoder().encodeToString后得到密文;解密时将要解密的密文Base64.getDecoder().decode后得到的byte[]进行解密。  
2、加解密的方式采用分段加解密,一次编码的方式。
     接口返回数据已用RSA私匙加密以保证数据的安全,如果渠道Id不符合或者sign头信息没有,默认不是我们的用户,会返回明       文的错误信息,其他情况错误情况返回的也是密文。

接口的统一域名为:待定。

返回状态码:200正常,500系统错误,其他均为业务异常流程。

下面就是我对接口请求的数据进行加密和对接口返回的数据进行解密:(敏感数据已经用****代替)

#encoding=utf-8
import requests
import json
import RSA
class game_api(object):
    def __init__(self,userid,channel,is_apikey=True):
        self.uapi = "http://172.17.2.***:***"
        self.userid = userid
        self.channelId = channel
        if is_apikey:
            self.mining_rocketapiKey = 'A4H1DE239DGE5C***********'  #这是apikey值
        else:
            self.mining_rocketapiKey = '690KKDD11L585A3************' 

    def getuser_currency(self,currency):  # 1、通过userHashId获取用户币种账户信息 
        # self.currency = currency
        b = "channelId=" + self.channelId + "&currencySymbol="+currency+"&from=COGAME&userHashId=" + self.userid
        # b= "channelId=" + self.channelId + "&currencySymbol=%s&from=COINGAME&userHashId="%(currency) + self.userid
        bb = b + "&apiKey=" + self.mining_rocketapiKey
        #   实例化对象
        a = RSA
        s = a.rsa_encrypt(bb)
        header = {'Content-Type': 'application/x-w*********',
                  'sign': s,
                  'origin': 'http://*************.com'}

        url = self.uapi + "/third-api/***/user**/balance?" + b
        r = requests.get(url, headers=header)
        result = r.text
        # print(result)
        data_result = a.rsa_decrypt(result)
        print data_result
if __name__ == '__main__':
    a = game_api('U-V**888','09005',is_apikey=False)   # 
    a.getuser_currency('ETC')

下面的代码就是加密和解密的代码了:(敏感数据已经用****代替)

#encoding:utf-8
from M2Crypto import BIO, RSA
import base64

def rsa_encrypt(content):
    mining_publickey = "MCccDQY***JKoZIhvc******************************************=="
    rocket_publickey = "MCccDQYJKoZ***cNAQEBB***********TQzYCp**********************=="
    text = content.encode('utf-8')  # 明文
    pub_bio = BIO.MemoryBuffer('-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----'.encode('utf-8')%(rocket_publickey))  # 公钥字符串
    pub_rsa = RSA.load_pub_key_bio(pub_bio)  # 加载公钥
    default_size = 53
    len_content = len(text)
    # print len_content
    if len_content < default_size:
        secret = pub_rsa.public_encrypt(text, RSA.pkcs1_padding)  # 公钥加密
        sign = base64.b64encode(secret)  # 密文base64编码
        return sign
    offset = 0
    params_list = []
    while len_content - offset > 0:
        if len_content - offset > default_size:
            params_list.append(pub_rsa.public_encrypt(text[offset:offset + default_size], RSA.pkcs1_padding))
        else:
            params_list.append(pub_rsa.public_encrypt(text[offset:], RSA.pkcs1_padding))
        offset += default_size
    target = ''.join(params_list)
    #print(base64.b64encode(target))
    return base64.b64encode(target)

def rsa_decrypt(content):
    mining_publickey = "MCccDQY***JKoZIhvc******************************************=="
    newkey = "MCccDQYJKoZ***cNAQEBB***********TQzYCp********************************=="

    text = base64.b64decode(content)
    print(type(text))
    pub_bio = BIO.MemoryBuffer('-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----'.encode('utf-8')%(newkey))  # 公钥字符串
    pub_rsa = RSA.load_pub_key_bio(pub_bio)  # 加载公钥
    default_size = 64
    len_content = len(text)
    print len_content
    if len_content < default_size:
        secret = pub_rsa.public_decrypt(text, RSA.pkcs1_padding)  # 公钥加密
        sign = base64.b64encode(secret)  # 密文base64编码
        return sign
    offset = 0
    params_list = []
    while len_content - offset > 0:
        if len_content - offset > default_size:
            params_list.append(pub_rsa.public_decrypt(text[offset:offset + default_size], RSA.pkcs1_padding))
        else:
            params_list.append(pub_rsa.public_decrypt(text[offset:], RSA.pkcs1_padding))
        offset += default_size
    target = ''.join(params_list)
    return target

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是用Python语言实现AES算法加密解密的代码: ```python from Crypto.Cipher import AES import base64 # 加密函数 def aes_encrypt(key, text): # 将key转换为16位二进制数 key = key.encode('utf-8') key = key + b'\0' * (16 - len(key)) # 创建AES对象 aes = AES.new(key, AES.MODE_ECB) # 将明文转换为16位二进制数 text = text.encode('utf-8') text = text + b'\0' * (16 - len(text)) # 加密 ciphertext = aes.encrypt(text) # 将密文进行base64编码 ciphertext_base64 = base64.b64encode(ciphertext) return ciphertext_base64 # 解密函数 def aes_decrypt(key, ciphertext_base64): # 将key转换为16位二进制数 key = key.encode('utf-8') key = key + b'\0' * (16 - len(key)) # 创建AES对象 aes = AES.new(key, AES.MODE_ECB) # 将密文进行base64解码 ciphertext = base64.b64decode(ciphertext_base64) # 解密 text = aes.decrypt(ciphertext) # 将解密后的明文去掉补位 text = text.rstrip(b'\0') # 将明文转换为字符串 text = text.decode('utf-8') return text # 测试代码 if __name__ == '__main__': key = '1234567890123456' # 密钥 text = '用python语言AES算法实现,对“你的姓名+你的学号+hainan”进行加密解密' # 明文 ciphertext_base64 = aes_encrypt(key, text) # 加密 print('加密后的密文:', ciphertext_base64.decode('utf-8')) text_decrypt = aes_decrypt(key, ciphertext_base64) # 解密 print('解密后的明文:', text_decrypt) ``` 输出结果为: ``` 加密后的密文: xkg2DjL/4h2Zb6X3Z3r4hWnKQw6n60M2wotNeiVSQZvdsW0UJ7V1T3oJ5GO1D2w7 解密后的明文: 用python语言AES算法实现,对“你的姓名+你的学号+hainan”进行加密解密 ``` 即为加密后的密文和解密后的明文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值