微信小程序及各种平台对接常用可逆加密算法aes256
不同程序之间经常会交换数据,我们经常采用的套路是:
假设要传输的信息是json,我们假设其为json_data,通过http传递信息为
json_data_encode=json_data&sign=md5(json_data+key)
接收方通过验证sign就知道内容有没有被篡改.
但是,这样json_data作为明码传送会让我们不太开心,所以今天的我们要介绍的aes256出马了,他是一强度很高的可逆加密算法!
aes256加密出来的内容是二进制的,不好通过http协议传输,所以我们再配合上base64转成ascii码
加密前,aes256要求字节数必须是32字节的倍数,所以使用pkcs7进行填充可以解决问题..介绍完原理,直接贴代码
写了3个版本,openresty及python和php的...请查收
local aes = require 'resty.aes'
local base64_encode = ngx.encode_base64
local base64_decode = ngx.decode_base64 local key = "a12e93c9edadeaa47eb1aeabe27dabef"
local iv = "a12e93c9edadeaa4"
-- AES 128 CBC with IV and no SALT
local cipher = aes.cipher(,"cbc")
local aes_256_cbc_with_iv = aes:new(key,nil,cipher,{iv=iv}) local function decrypt(input)
input = base64_decode(input)
input = aes_256_cbc_with_iv:decrypt(input)
-- 取最后一个字符的ascii值
--local padding = string.byte(input,-1)
--return string.sub(input,-padding)
return input
end local function pkcs7_padding(text)
local text_length = string.len(text)
local amount_to_pad = - (text_length % ) if amount_to_pad == then
amount_to_pad =
end
local pad = string.char(amount_to_pad) return text .. string.rep(pad,amount_to_pad)
end local function encrypt (text)
text = pkcs7_padding(text)
text = aes_256_cbc_with_iv:encrypt(text)
return base64_encode(text)
end print(decrypt(encrypt('linbc')))
接着是python版本的
#!/usr/bin/env python
# -*- coding: utf-8 -*- import base64 from Crypto.Cipher import AES import binascii
import StringIO class PKCS7Encoder(object):
'''
RFC 2315: PKCS#7 page 21
Some content-encryption algorithms assume the
input length is a multiple of k octets, where k > 1, and
let the application define a method for handling inputs
whose lengths are not a multiple of k octets. For such
algorithms, the method shall be to pad the input at the
trailing end with k - (l mod k) octets all having value k -
(l mod k), where l is the length of the input. In other
words, the input is padded at the trailing end with one of
the following strings: 01 -- if l mod k = k-1
02 02 -- if l mod k = k-2
.
.
.
k k ... k k -- if l mod k = 0 The padding can be removed unambiguously since all input is
padded and no padding string is a suffix of another. This
padding method is well-defined if and only if k < 256;
methods for larger k are an open issue for further study.
'''
def __init__(self, k=16):
self.k = k ## @param text The padded text for which the padding is to be removed.
# @exception ValueError Raised when the input padding is missing or corrupt.
def decode(self, text):
'''
Remove the PKCS#7 padding from a text string
'''
nl = len(text)
val = int(binascii.hexlify(text[-1]), 16) if val > self.k:
raise ValueError('Input is not padded or padding is corrupt') l = nl - val return text[:l] ## @param text The text to encode.
def encode(self, text):
'''
Pad an input string according to PKCS#7
'''
l = len(text)
output = StringIO.StringIO()
val = self.k - (l % self.k) for _ in xrange(val):
output.write('%02x' % val) return text + binascii.unhexlify(output.getvalue()) # 使用256位的AES,Python会根据传入的Key长度自动选择,长度为16时使用128位的AES
key = 'a12e93c9edadeaa47eb1aeabe27dabef'
mode = AES.MODE_CBC
#iv = '1234567812345678' # AES的CBC模式使用IV
iv = 'a12e93c9edadeaa4' # AES的CBC模式使用IV encoder = PKCS7Encoder()
text = "This is for test." def encrypt(data):
encryptor = AES.new(key, AES.MODE_CBC, iv)
padded_text = encoder.encode(data)
encrypted_data = encryptor.encrypt(padded_text) return base64.b64encode(encrypted_data) def decrypt(data):
cipher = base64.b64decode(data)
decryptor = AES.new(key, AES.MODE_CBC, iv)
plain = decryptor.decrypt(cipher) return encoder.decode(plain) #encrypted_text = encrypt(text)
encrypted_text = 'MD1ZOvuyvut4VEed4rf+8YKaOHyECJK/RWLcfVsJwjAEZp8Hhi1zi7oH3PLSygjFCAxCRJqMBzm/qhreznkg34Vgbho+zwprTgl4M0c0lRkvLzWzXmSYG8pcqth1qnbNSwQeS3MPuofgVXR0SGMTIzicCXDlmwQV9uvIJekgES2LMse4pVndcrftI9f6UbIiT085DhAaiV9yGsV3r4FES+LnwP9ZNi58TButNC9owyKh9RuRn7z04LfNy++7iLjzk/HurOkBkJewHSchLER+pK94qhg6Lj8mW7dl+y5j3wbXY9SodNK+S8LDRYCa1JyZ/w8rffUK8YCY+jCT3ZmV8G5vdUENTqsrB4jX87C+XQCY9WEG+VQ5MK5XlhhvMPZyn2NLZUi6gW1HjqE6i/uefzq/LFl47cL2Hmr/cLbfI5rF+d1hMAIZGNnRxjYkVVvipEwRSlkD47ZVFLiWRKPusB7Lke3mnGJ1O+5eQnREL7Q/xpRT+3JuCcOqZIZJFFrJXMj9CXsJGMXxFkfnKT3UAhOi/lRA65Vwt1BEswHuZzLLHquyEYQMc3cOW1vy1Fv4zpYkjHYmxB1g50gwVryrEW2kY58sDdxwDYua3jLwERk=' clean_text = decrypt(encrypted_text) print "encrypted_text:", encrypted_text
print "clean_text: ", clean_text
再来个php版本的
<?php
//function aes256EcbPkcs7PaddingEncrypt($key, $data) {
// $padding = 16 - (strlen($data) % 16);
// $data .= str_repeat(chr($padding), $padding);
// return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, hash('SHA256', $key, true), $data, MCRYPT_MODE_ECB);
//}
//
//function aes256EcbPkcs7PaddingDecrypt($key, $data) {
// $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, hash('SHA256', $key, true), $data, MCRYPT_MODE_ECB);
// $padding = ord($data[strlen($data) - 1]);
// return substr($data, 0, -$padding);
//}
$txt="MD1ZOvuyvut4VEed4rf+8YKaOHyECJK/RWLcfVsJwjAEZp8Hhi1zi7oH3PLSygjFCAxCRJqMBzm/qhreznkg34Vgbho+zwprTgl4M0c0lRkvLzWzXmSYG8pcqth1qnbNSwQeS3MPuofgVXR0SGMTIzicCXDlmwQV9uvIJekgES2LMse4pVndcrftI9f6UbIiT085DhAaiV9yGsV3r4FES+LnwP9ZNi58TButNC9owyKh9RuRn7z04LfNy++7iLjzk/HurOkBkJewHSchLER+pK94qhg6Lj8mW7dl+y5j3wbXY9SodNK+S8LDRYCa1JyZ/w8rffUK8YCY+jCT3ZmV8G5vdUENTqsrB4jX87C+XQCY9WEG+VQ5MK5XlhhvMPZyn2NLZUi6gW1HjqE6i/uefzq/LFl47cL2Hmr/cLbfI5rF+d1hMAIZGNnRxjYkVVvipEwRSlkD47ZVFLiWRKPusB7Lke3mnGJ1O+5eQnREL7Q/xpRT+3JuCcOqZIZJFFrJXMj9CXsJGMXxFkfnKT3UAhOi/lRA65Vwt1BEswHuZzLLHquyEYQMc3cOW1vy1Fv4zpYkjHYmxB1g50gwVryrEW2kY58sDdxwDYua3jLwERk=";
$txt=base64_decode($txt);
$key="a12e93c9edadeaa47eb1aeabe27dabef";
$iv ='a12e93c9edadeaa4';
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($module, $key, $iv);
$data = mdecrypt_generic($module, $txt);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
$padding = ord($data[strlen($data) - 1]);
$result = substr($data, 0, -$padding);
echo $result;
exit();
?>
php果然是...很省事的语言..看他多简短啊.
微信小程序及各种平台对接常用可逆加密算法aes256的更多相关文章
- $微信小程序开发实践点滴——Bmob常用API的使用
Bmob后端云官网:http://www.bmob.cn/ Bmob后端云微信小程序开发文档:http://docs.bmob.cn/data/wechatApp/b_developdoc/doc/i ...
- 「速成应用」实在可靠的 微信小程序第三方代理加盟平台公司
小程序,是基于微信平台的一个划时代产品,也就是嵌入到微信里的一个功能丰富.操作简洁的轻应用,不需要下载安装即可使用.不同的小程序,能实现不同的功能.例如,买电影票.餐厅排号.餐馆点菜.查询公交.查询股 ...
- 微信小程序小结(5) -- 常用语法
在 pages 字段的第一个页面就是这个小程序的首页(打开小程序看到的第一个页面). Page生命周期 属性 类型 描述 onLoad Function 生命周期函数--监听页面加载.一个页面只会调用 ...
- 微信小程序想要的是无法监测的流量dark social
“微信小程序”将带来什么样的变化?就单单的是一个超级Web app?还是只是为了给大家手机节省一些空间?腾讯想要的是高达70%以上的“无法监测的巨大流量”,称之为“dark social”(暗社交). ...
- 微信小程序----没有 DOM 对象,一切基于组件化 ---- mpvue
封装好用的 类库 和 组件,复用且灵活度高 抽取相同的部分放在函数内部(组件内部) 抽取不同的部分放在形参(组件 props 传参,或者插槽) new Promise 运行时 初始化实例对象的状态为 ...
- Jmeter微信小程序接口测试
最近公司新项目组开发一款微信小程序电商平台,为了更好保证产品质量,因此提出了需要进行接口测试. 从接口本身来讲,对其测试与其他项目应该是一样的.所以不难理解,我们要对小程序的接口测试需要准备的 材料有 ...
- 不走弯路,微信小程序的快速入门?
微信小程序下载注册地址:https://mp.weixin.qq.com/cgi-bin/wx 微信小程序登开发者平台地址(可以查看小程序APPID):https://mp.weixin.qq.com ...
- 基于小程序云Serverless开发微信小程序
本文主要以使用小程序云Serverless服务开发一个记事本微信小程序为例介绍如何使用小程序云Serverless开发微信小程序.记事本小程序的开发涉及到云函数调用.云数据库存储.图片存储等功能,较好 ...
- php对接微信小程序支付
前言:这里我就假装你已经注册了微信小程序,并且基本的配置都已经好了.注: 个人注册小程序不支持微信支付,所以我还是假装你是企业或者个体工商户的微信小程序,其他的商户号注册,二者绑定,授权,支付开通,就 ...
随机推荐
- 图说超线程技术(Hyper-Threading Technology)
在操作系统中,有多线程(multi-threading)的概念,这很好理解,因为线程是进程最小的调度单位,一个进程至少包含一个线程.本文将介绍CPU特有的超线程技术.简单来说就是,多线程比较软,超线程 ...
- 使用ehCache作为本地缓存
package nd.sdp.basic.config; import org.springframework.cache.CacheManager; import org.springframewo ...
- FPGA加速:面向数据中心和云服务的探索和实践
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由columneditor 发表于云+社区专栏 作者介绍:章恒--腾讯云FPGA专家,目前在腾讯架构平台部负责FPGA云的研发工作,探索 ...
- R语言数组array函数
数组是一个可以在两个以上的维度存储数据的R数据对象.例如 - 如果创建尺寸(2,3,4)的数组,那么创建4个矩形矩阵每2行3列.数组只能存储数据类型. 使用 array()函数创建数组.它需要向量作为 ...
- 第一章:初识PHP
Web程序工作原理介绍? 工作方式? 浏览器首先向Web服务器发出请求,Web服务器对请求做出响应,将响应数据发送给客户端浏览器,通常是一个HTML文件,然后通过浏览器把HTML文件信息显示在屏幕上. ...
- JavaScript ES6 Symbol.hasInstance的理解。
Symbol.hasInstance 本案例是结合阮一峰老师的ECMAScript 6 入门丛书进一步的详细介绍,和对Symbol.hasInstance的理解.本着互联网的精神,分享给大家. 对象的 ...
- mysql索引对单表查询的影响
索引被用来快速找出在一个列上用一特定值的行.没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行.表越大,花费时间越多. 如果表对于查询的列有一个索引,MySQL能快速到达 ...
- springboot的依赖注入报null的问题
最近使用springboot开发项目,使用到了依赖注入,频繁的碰到注入的对象报空指针,错误如下 java.lang.NullPointerException: null at com.mayihc.a ...
- Visual studio 2013打开报异常"Exception has been thrown by the target of an invocation"
最近遇到一个问题,打开VS2013和SQL Server2014都会出报错,错误信息如下: 以前都是好好的,重启了机子也不行,能打开两个VS,再打开第三个VS还是会报错,百度无果,还是在google上 ...
- Luogu4433:[COCI2009-2010#1] ALADIN(类欧几里德算法)
先套用一个线段树维护离散化之后的区间的每一段的答案 那么只要考虑怎么下面的东西即可 \[\sum_{i=1}^{n}(A\times i \ mod \ B)\] 拆开就是 \[\sum_{i=1}^ ...