微信小程序及各种平台对接常用可逆加密算法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(256,"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 = 32 - (text_length % 32)

     if amount_to_pad == 0 then
         amount_to_pad = 32
     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果然是...很省事的语言..看他多简短啊.

原文地址:https://www.cnblogs.com/linbc/p/9710487.html

时间: 2024-10-12 02:37:52

微信小程序及各种平台对接常用可逆加密算法aes256的相关文章

微信小程序软件开发平台

微信小程序系统,带领数万商家开拓新零售,全面提升产品迭代速度,微信小程序系统适合多个领域行业,为企业带来更多客户,提高企业竞争力.微信小程序开发找巢杰:135-3388-6017(微信同号) 一.微信小程序系统对商家来说能带来哪些优势? 1.满足了需求:大多数的线下门店想要开发小程序,可是对于小程序的认识也是太少了,门店小程序小而明了,可以和公众号的功能相通,更能使用户直接去找到商户的位置. 2.流量的转化:当下小程序大多都是以线上服务为主,还没有把微信"连接线上线下"的理念贯通起来.

微信小程序小结(5) -- 常用语法

在 pages 字段的第一个页面就是这个小程序的首页(打开小程序看到的第一个页面). Page生命周期 属性 类型 描述 onLoad Function 生命周期函数--监听页面加载.一个页面只会调用一次,可以在 onLoad 中获取打开当前页面所调用的 query 参数. onReady Function 生命周期函数--监听页面初次渲染完成.一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互. onShow Function 生命周期函数--监听页面显示.每次打开页面都会调用一

微信小程序快递鸟快递查询接口对接

微信小程序快递查询接口对接指南 1.登录快递鸟官网注册页面注册快递鸟账号 网址:http://www.kdniao.com/reg 2.登录快递鸟用户管理后台 网址:http://www.kdniao.com/login 注:登录快递鸟用户管理后台后获得用户ID和APIKey,此用于保证应用来源的可靠性,避免应用伪造,被不法使用. 3.进入“我的会员中心”进行实名认证 注: 3.1.认证类型.应用类型根据用户实际情况选择即可,接口返回数据与选择结果无关: 3.2.标记为*的为必填,要求上传清晰.

不走弯路,微信小程序的快速入门?

微信小程序下载注册地址:https://mp.weixin.qq.com/cgi-bin/wx 微信小程序登开发者平台地址(可以查看小程序APPID):https://mp.weixin.qq.com 微信小程序简易官网:https://developers.weixin.qq.com/miniprogram/dev/ 小程序登陆开发者账号: 密码: 开发者工具登录:填写AppID,微信确认,进行个人项目开发: 开发者工具下载版本与介绍:https://developers.weixin.qq.

php对接微信小程序支付

前言:这里我就假装你已经注册了微信小程序,并且基本的配置都已经好了.注: 个人注册小程序不支持微信支付,所以我还是假装你是企业或者个体工商户的微信小程序,其他的商户号注册,二者绑定,授权,支付开通,就阅读文档吧,这里我先负责实战. 微信小程序支付开发文档: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1 基本流程: 1. 申请商户平台账号 https://pay.weixin.qq.com/in

CabloyJS的微信API对接模块:当前支持微信公共号和微信小程序

Cabloy-微信是什么 Cabloy-微信是基于CabloyJS全栈业务开发框架开发的微信接口模块,当前整合了微信公共号和微信小程序的接口,达到开箱即用的使用效果.在Cabloy-微信的基础上,可以很方便的开发各类微信业务系统 特性 基于CabloyJS全栈框架提供的便利性和灵活性,Cabloy-微信主要有如下特性: 1. 一站式整合 当前整合了微信公共号和微信小程序的接口,具体如下: 场景 名称 说明 微信公共号 消息系统 自动完成接口对接,并自动进行用户注册 微信公共号 网页登录 自动跳转

小程序开发运营必看:微信小程序平台运营规范

一.原则及相关说明 ? 微信最核心的价值,就是连接——提供一对一.一对多和多对多的连接方式,从而实现人与人.人与智能终端.人与社交化娱乐.人与硬件设备的连接,同时连接服务.资讯.商业. ? 微信团队一直致力于将微信打造成一个强大的.全方位的服务工具.在此基础上,我们推出了微信小程序这个产品,提供给微信小程序的开发者在微信内搭建和实现特定服务.功能的平台.通过全面开放的能力,我们将更多连接的可能给予企业和服务提供者,并为微信小程序提供基础的接入能力.运营环境和规则体系,进而帮助更多的企业和服务提供

店铺无缝对接一号旺铺小程序 盘点微信小程序新增功能

前段时间,笔者写过一篇<不开发,商家店铺如何快速接入微信一号旺铺小程序>的文章.结果反响平平,无人问津.所以,笔者就在想,也许小程序真的大势已去. 盘点迄今为止微信小程序增加的功能:价值提升,商家福音到了! 盘点迄今为止微信小程序增加的功能:价值提升,商家福音到了! 但是,就在本人下定决心以后少关注小程序的当口,腾讯似乎终于觉醒了,张小龙也终于向现实低头妥协,微信官方宣布的小程序新增功能绝地反击,热乎了众多商家的心,也活跃了个人创业开发者的兴奋基因.其实,自小程序面市已来,其功能一直在不断完善

CK2020微信小程序入门与实战 常用组件API开发技巧项目实战

新年伊始,学习要趁早,点滴记录,学习就是进步! 随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到程序开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了.对于学习有困难不知道如何提升自己可以加扣:1225462853  获取资料. 下载地址:https://pan.baidu.com/s/1hsU5EIS 微信小程序入门与实战 常用组件API开发技巧项目实战 小程序官方正式公告,开放了更多的入口,个人开发者可以申请