python aes 128 gcm

最近防沉迷的api用到aes 128 gcm
python 3版本

import json
from Crypto.Cipher import AES
import base64
import requests
import hashlib
import time
import os
import binasciiURL = "https://wlc.nppa.gov.cn/test/authentication/check"
KEY = "d10d8642c66c1c785aa32b194aba2afa"
APPID = "9177929f5010481b858f661a409fd764"
BIZID = "1101999999"TEST_PARAMS = {"ai":"100000000000000001",
"name":"某一一",
"idNum":"110000190101010001"}class AES_GCM(object):def __init__(self, key):self.key = key  #秘钥self.MODE = AES.MODE_GCMself.iv = os.urandom(12)def aes_encrypt(self, params):aes = AES.new(binascii.unhexlify(self.key), self.MODE, self.iv)params, tag=aes.encrypt_and_digest(json.dumps(params).encode("utf-8"))base64_data= self.iv + params + tagencrypted_text = str(base64.b64encode(base64_data), encoding='utf-8')return encrypted_textdef aes_decrypt(self, encrypted_text):encrypted_text = base64.b64decode(encrypted_text)cipher = AES.new(binascii.unhexlify(self.key), self.MODE, encrypted_text[:12])cc = cipher.decrypt_and_verify(encrypted_text[12:-16], encrypted_text[-16:])return json.loads(cc)def hash256(pre_hash_text):hs256 = hashlib.sha256()    hs256.update(pre_hash_text.encode())    return hs256.hexdigest()  def sorted_params(params, param_="%s%s", none_keys = []):return "".join([param_ % i for i insorted(params.items(), key=lambda d:d[0]) if i[0] not in none_keys])    def main():aesobject = AES_GCM(KEY)aes_gcm = aesobject.aes_encrypt(TEST_PARAMS)body_data='{"data":"%s"}' % aes_gcm  ## 国家游戏防沉迷的api试了不能进行json.dumps()_time =  str(int(time.time()*1000)) ## 加入请求头报文headers = {"Content-Type":"application/json; charset=utf-8","appId":APPID,"bizId":BIZID,"timestamps":_time}## 对请求头报文排序并排除 不必要的字段进行字符串拼接params_str = sorted_params(headers, none_keys=["Content-Type"])headers["sign"] = hash256("".join([KEY, params_str, body_data]))# print(aesobject.aes_decrypt(aes_gcm)) ## 解码response = requests.post(URL, headers=headers, data= body_data)print(response.json())if __name__ == '__main__':main()

兼容python3和python2 版本
因个别老系统可能还在使用python2进行维护,出个兼容版本

#coding:utf8
"""安装 cryptography  支持2.7+ and 3.4+  建议在linux在调试 """
import sys
import os
import base64
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import (
Cipher, algorithms, modes
)
import binasciiPY2 = sys.version_info[0] == 2
if PY2:reload(sys)sys.setdefaultencoding("utf8") ## 在python2一定要加上,否则会出现编码问题def encrypt(key, plaintext):"""加密"""iv = os.urandom(12)encryptor = Cipher(algorithms.AES(binascii.unhexlify(key)),modes.GCM(iv),backend=default_backend()).encryptor()plaintext = encryptor.update(plaintext)finalize = encryptor.finalize() ## tag = encryptor.tagciphertext =iv + plaintext+ finalize + tag return base64.b64encode(ciphertext)def decrypt(key, ciphertext):"""解密"""ciphertext = base64.b64decode(ciphertext)decryptor = Cipher(algorithms.AES(binascii.unhexlify(key)),modes.GCM(ciphertext[:12], ciphertext[-16:]),).decryptor()return decryptor.update(ciphertext[12:-16]) + decryptor.finalize()
if __name__ =='__main__':key = "d10d8642c66c1c785aa32b194aba2afa"data = '{"ai":"100000000000000001","name":"某一一","idNum":"110000190101010001"}'ciphertext = encrypt(key, data.encode("utf8")) ## print(ciphertext)print(decrypt(key, ciphertext))

查询是否认证示例代码

#coding:utf8import requests
import hashlib
import timeurl = "https://wlc.nppa.gov.cn/test/authentication/query?ai=100000000000000001"key = "d10d8642c66c1c785aa32b194aba2afa"def sorted_params(params, param_="%s%s", none_keys = []):return "".join([param_ % i for i insorted(params.items(), key=lambda d:d[0]) if i[0] not in none_keys])
def hash256(pre_hash_text):hs256 = hashlib.sha256()    hs256.update(pre_hash_text.encode())    return hs256.hexdigest()_time =  str(int(time.time()*1000))headers = {"Content-Type":"application/json; charset=utf-8","ai":"100000000000000001",
"appId":"9177929f5010481b858f661a409fd764","bizId":"1101999999","timestamps":_time}_str = sorted_params(headers, none_keys=["Content-Type"])
_str =key+_str ## 加密的key要放在最前面sign = hash256(_str)
headers["sign"] = sign
headers.pop("ai", None) ## 最好去掉,不去掉也目前也是可以的response = requests.get(url, headers=headers)print(response.json())

返回结果示例,已认证会有pi值返回

{'errcode': 0, 'errmsg': 'OK', 'data': {'result': {'status': 0, 'pi': '1fffbjzos82bs9cnyj1dna7d6d29zg4esnh99u'}}}

python aes 128 gcm 防沉迷身份认证相关推荐

  1. Python渗透测试编程技术--------身份认证攻击(一)

    Python渗透测试编程技术 身份认证攻击 目前最为常见的身份验证模式采用的仍然是"用户名+密码"的方式,用户自行设定密码在登录时如果输入正确的密码,计算机就会认为操作者是合法用户 ...

  2. python的requests快速上手、高级用法和身份认证

    https://blog.csdn.net/qq_25134989/article/details/78800209 快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其 ...

  3. Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储

    原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...

  4. Python+OpenCv实现AI人脸识别身份认证系统(1)——人脸识别原理

    原 Python+OpenCv实现AI人脸识别身份认证系统(1)--人脸识别原理 置顶 2019年07月02日 08:47:40 不脱发的程序猿 阅读数 1255更多 所属专栏: 人脸识别身份认证系统 ...

  5. python http 身份认证简介

    目录 授权方式简介 1. Basic Authentication 2. OAuth 3. Token Authentication 4. Digest Authentication(重点说一下) 代 ...

  6. “人生苦短,我用Python“——身份认证攻击

    身份认证攻击 身份认证攻击 简单网络服务认证攻击 FTP暴力破解模块 SSH暴力破解模块 Web暴力破解模块 身份认证攻击 目前最常见的身份认证模式采用的仍然是"用户名+密码"的方 ...

  7. 基于Python实现的SKey身份认证协议

    资源下载地址:https://download.csdn.net/download/sheziqiong/85621996 SKey 身份认证协议的代码实现 本项目为课程实验内容,简单模拟了通过S/K ...

  8. Python+OpenCV实现AI人脸识别身份认证系统(4)—人脸识别

    本篇博文是Python+OpenCV实现AI人脸识别身份认证系统的收官之作,在人脸识别原理到数据采集.存储和训练识别模型基础上,实现人脸识别,废话少说,上效果图: 案例引入 在Python+OpenC ...

  9. Python+OpenCv实现AI人脸识别身份认证系统(3)——训练人脸识别模型

    目录 案例引入 本节项目 最近有小伙伴们一直在催本项目的进度,好吧,今晚熬夜加班编写,在上一节中,实现了人脸数据的采集,在本节中将对采集的人脸数据进行训练,生成识别模型. 案例引入 首先简要讲解数据集 ...

最新文章

  1. linux 的一个防火墙策略
  2. 图文解释XCode常用快捷键的使用
  3. Could not find destination factory for transport解决方法
  4. 计算机硬件价钱分配,电脑基础知识计算机硬件基础课件.ppt
  5. AT2005-[AGC003E]Sequential operations on Sequence【差分,思维】
  6. AT2300-[ARC068C]Snuke Line【整除分块】
  7. jsf 传参数_在JSF 2中对定制验证器进行参数化
  8. 征途pak文件修改_传奇技能,第十四祭:装备属性修改与增加新装备
  9. 一文搞懂C语言回调函数
  10. Linux开启服务器问题(李蕾问题)
  11. java ini_java读取ini格式的文件
  12. Oracle如何实现跨库查询
  13. freeswith 录制 MP4格式视频
  14. Python纯代码pdf批量快速转换成ppt
  15. 使用 WinRAR 将bat转exe
  16. 图像处理之图像直方图
  17. iPhone, iPad 安装 ipa 文件
  18. python列表(list)
  19. B站向快视频发律师函;2017年网络直播用户4.22亿;委内瑞拉预售“石油币”丨价值早报
  20. mysql 输入法表情数据,mysql 5.7 版本输入法表情符问题-----java解决办法

热门文章

  1. unity单例模式两种_Unity和GameAnalytics合作起来! Roadhouse Interactive通过两种工具分享他们的经验
  2. inkscape转换svg为pdf
  3. linux安装方舟编译器,华为方舟编译器安装 软件源码地址,华为方舟编译器安装 软件源码地址预约 - 浏览器家园...
  4. 纵深防御体系_纵深防守
  5. struts2-类型转换器
  6. [Python爬虫] 二、爬虫原理之定义、分类、流程与编码格式
  7. 类型多样的摩托车 三轮车cc0高清摄影图片素材,速来收藏
  8. 基于php签到考勤系统的设计
  9. 解决笔记本win7系统玩游戏不能全屏办法
  10. 画论12 张彦远《历代名画记》