Crypto

Posted wly-blogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Crypto相关的知识,希望对你有一定的参考价值。

#!/usr/bin/env python
# coding=utf-8
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
import base64
import json
import requests
import hashlib
import time
import sys

#  调用的时候先使用  init的方法,然后再调用对应的接口
class cweisrequest():

	def __init__(self):
		self.mode = AES.MODE_CBC

#加密函数,如果text不是16的倍数【加密文本text必须是16的倍数】那就补足为16的倍数
	def cwiesencrypt(self, text):
		cryptor = AES.new(self.key, self.mode, self.key)
		# print cryptor
#这里秘钥key长度必须为16(AES-128)、24(AES-192)、或32(AES-256)
		length = 16
		count = len(text)
		add = length - (count % length)
		text = text + (‘‘ * add)
		self.ciphertext = cryptor.encrypt(text)
		return base64.b64encode(self.ciphertext)

#解密后去掉补足的空格strip()去掉
	def cweisdecrypt(self,text):
		cryptor = AES.new(self.key, self.mode, self.key)
		# plain_text = cryptor.decrypt(a2b_hex(text))
		plain_text = cryptor.decrypt(text)
		return plain_text.rstrip(‘‘)


	def init(self, appid, appsecret, baseurl):
		self.key = appsecret[8:24].upper()
		self.appid = appid
		self.baseurl = baseurl


	def img2Base64(self,imgpath):
		with open(imgpath,"rb") as f:
			# b64encode是编码,b64decode是解码
			return base64.b64encode(f.read())

	def cweispost(self,paramDict, url):
		#将字典数据转成json
		sJsonParam = json.dumps(paramDict)
		#对json数据使用aes加密
		sParamValue = self.cwiesencrypt(sJsonParam)
		# print sParamValue
		#对ase加密之后的数据使用md5加密
		lolValue = hashlib.md5(sParamValue).hexdigest().upper()
		# print lolValue
		# 得到时间戳
		timestamp = int(time.time() * 1000)
		# print timestamp
		# 序列化
		sequence = [str(timestamp), self.appid, lolValue]
		#逆序
		sequence.sort(reverse=True)
		# 拼接
		signValue = "".join(sequence)
		# 对得到的拼接字符串用sha1加密
		signature = hashlib.sha1(signValue).hexdigest().upper()
		# print signature
		newParamDict = {
			"appid": self.appid,
			"lol": lolValue,
			"timestamp": timestamp,
			"sParam": sParamValue,
			"signature": signature
		}
		urlValue = self.baseurl + url
		# print urlValue,newParamDict
		#模拟http请求
		response = requests.post(urlValue, data=newParamDict, verify=False)
		#得到请求的结果
		pageValue = response.content
		#对返回的结果用aes解密
		# print pageValue
		return self.cweisdecrypt(base64.b64decode(pageValue))


# #1、获取联网核查图片(老接口)
	def getImgByCIdAndName(self, cId, cName, busFlowId=0):
		paramDict = {
				"cId": cId,
				"cName": cName,
				"busFlowId": busFlowId
		}
		return self.cweispost(paramDict, "getImgByCIdAndName")

  

以上是关于Crypto的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:stream_socket_enable_crypto():SSL操作失败,代码1 [重复]

Crypto++ Ed448 未知 oid

为什么Crypto ++中的AES代码会产生不同的性能结果?

localhost 和“stream_socket_enable_crypto():SSL 操作失败,代码为 1”[重复]

crypto/ssh ParsePublicKey“短读”错误

Crypto另外两段加密解密的代码