lua 与 php 通过AES数据加密进行通讯

最近公司有款《围住神经猫》的微信小游戏火爆的不行!公司又决定开发一系列的神经猫的小游戏,于是,我被拉过来了。

后来使用cocos-2dx 开发一款小游戏,客户端用的是lua脚本,为了服务器与客户端交互的安全性,我们决定对API接口

传输的JSON数据进行加密、解密。一般情况就是客户端加密,服务器段进行解密:

lua客户端使用的是一个纯lua写的库:aeslua,下载地址:http://luaforge.net/projects/aeslua/

但是该库是有问题的:用该库加密解密是没有问题的,但是跟PHP通讯就存在问题了,因为该库加密后base64之后的

字符串PHP是无法解密的!为了这个问题,我查阅了好多资料,终于找到某个国外大神的解决办法:

http://chainans.blogspot.com/2012/09/working-with-lua-encryption.html(可能有些同学无法FQ,故把原文贴出来如下:)

Working with Lua encryption

Recently working with Corona SDK, I start to need some standard encryption/decryption algorithm in Lua. To start with, actually, it has rather small number of developers comparing to the Objective-C which I have been working with. Meaning that there are fewer
3rd party librarys you can rely upon. Luckily, I found one called AESLua which has some code to start. From there, my objective is to make a way to securely passing data between my client and server. (php on server-side) In fact, from what I‘d read, my method
is not very secure but it is better than nothing. Just for my reference, here are the list of issues along the way

Edited: Tested with iPhone 4... Input cipher text of 1280 characters. Take around 25 seconds. Unacceptable speed for general uses.

1) It requires Lua 5.2 feature which does not seem to be in Corona

Solution: Download LuaBit v0.4 and integrate it... You will need to make a mapping to allow API call to the proper place

2) Next you need to get Base64 library -- grab it here https://gist.github.com/2563975 -- It initially made to allow passing it over the URL (using ‘-‘ and ‘_‘ instead of ‘+‘ and ‘/‘) So, I change them to the latter one.

3) For AESLua, by default, it uses AES-128, CBC, some kind of random padding <- I don‘t know its name, IV = 0. I will change it into is AES-128, CBC, PKCS7 padding. Here are the website to test if our conversion is ok or not

http://www.unsw.adfa.edu.au/~lpb/src/AEScalc/AEScalc.html

http://www.tools4noobs.com/online_tools/decrypt/

Here are the things to do

3.1) In pwInKey function, comment the line out

password = ciphermode.encryptString(pwBytes, password, ciphermode.encryptCBC);

3.2) In util.padByteString function, change it to

    local paddingLength = math.ceil(#data/16)*16 - #data;

    local padding = "";

    local paddingValue = string.char ( paddingLength )  -- PKCS7 padding

    for i=1,paddingLength do

padding = padding .. paddingValue;
-- PKCS7 padding

    end 

    return data .. padding;

4) Set up web server for testing, you will need php / mcrypt mod to test.

5) Creating a php for testing... here is a code

Now, my plain text below is "[email protected]#%de".

<?php

$data = ‘dXzNDNxckOrb7uz2ON0AAJp4BXgkYewblTNWBSAQSEw=‘;

$key128 = ‘1234567890123456‘;

$iv =  ‘\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0‘;

echo mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key128, base64_decode($data), MCRYPT_MODE_CBC, $iv)

?>

That‘s it. The encryption backward to client machine should be a piece of cake. =)

*** By using these library, the user should be aware of the fact that Lua‘s performance is still far from native code. You may not want to use this algorithm to encrypt a large volume of data.

按照他的办法,一切都OK了。但是有以下几点需要说明以下:(本人摸索的)

1.利用CBC模式加密的字符串的key必须是16位,否则PHP无法解密!

2.明文字符串的必须把key作为前缀加进去

3.上面文章中没有把unpack函数写出来,本人查阅了一些资料,补充了,否则aeslua无法正常解密了!

util.lua中的下面这个函数改为如下:

function public.unpadByteString(data)

local padLength = tonum((string.byte(data, #data)));

return string.sub(data,1, #data-padLength)   --unpack

end

lua 与 php 通过AES数据加密进行通讯

时间: 2024-10-03 21:41:33

lua 与 php 通过AES数据加密进行通讯的相关文章

使用openssl库实现RSA、AES数据加密

使用openssl库实现RSA.AES数据加密 openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加密:公钥加密,私钥解密.openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所以一般的做法是使用对称密钥加密数据,然后再把这个只在当前有效的临时生成的对称密钥用非对称密钥的公钥加密之后传递给目标方,目标方使用约定好的非对称密钥中的私钥解开,得到数据加密的密钥,再进行数据解密,得到数据,这种使用方式很常见,可以认为是对HTTPS的裁剪.对称

python3 + Vue 应用 AES 数据加密

python3 + Vue 应用 AES 数据加密 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的).对称加密算法也就是加密和解密用相同的密钥,具有以下几个特点: 1.最常用的对称加密算法 2.密钥建立时间短.灵敏性好.内存需求低 3.实际使用中,使用工作模式为CTR(最好用BC去实现),此工作模式需要引入IV参数(16位的字节数组) 4.密钥长度128/192/256,其中192与256需要配置无政

基于python3和Vue实现AES数据加密

**高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的).对称加密算法也就是加密和解密用相同的密钥,具有以下几个特点: 1.最常用的对称加密算法2.密钥建立时间短.灵敏性好.内存需求低3.实际使用中,使用工作模式为CTR(最好用BC去实现),此工作模式需要引入IV参数(16位的字节数组)4.密钥长度128/192/256,其中192与256需要配置无政策限制权限文件(JDK6)5.填充模式最常用的两种PK

[C++] WinAES的问题

WinAES是个不错的windows CAPI封装. 如果C++程序需要和java的程序进行aes加解密通讯,那么WinAES的代码是有问题的. java的aes代码缺省不会设置IV而且采用ECB模式. 所以为了和java之间进行aes加解密,WinAES需要把Encrypt函数里面assert IV的代码去掉,并且在set key的时候指定ECB模式. [C++] WinAES的问题,布布扣,bubuko.com

我的ios-App

1.PocketConfidential(密保箱) 简介 保存账号密码等敏感信息. 应用技术: sqlite.sqlcipher加密.AES数据加密.GCD https://itunes.apple.com/us/app/mi-bao-xiang/id898184998?l=zh&ls=1&mt=8 持续更新... 我的ios-App

常用的加密算法--对称加密

对称加密是最快速.最简单的一种加密方式,加密与解密用的是相同的密钥.对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中. 对称加密通常使用的是相对较小的密钥,一般小于256 bit.因为密钥越大,加密越强,但加密与解密的过程越慢. 常见的对称加密算法:DES算法.3DES算法 .AES算法 特点:算法公开,计算量小,加密速度快,加密效率高.其安全性主要依赖于秘钥的安全性.加密的时候使用的密钥只有一个. DES算法 对称加密算法,明文按照64位进行分组,密钥长64位,但是

Cocos2dx-C++和Lua数据通讯

本文转载于:http://www.cnblogs.com/zisou/p/cocos2dx-lua2.html 我们主要解决如下几个问题: 1,C++如何获取Lua里面的一个变量值? 2,C++如何获取Lua里面一个Table(Lua利用Table实现面向对象,那就能调用Lua里面的比较高级的引用方法) 3,C++如何访问Lua里面的一个方法? 4,C++如何访问Lua里面的一个带参数的方法? 5,C++如何访问Lua里面的一个带参数的方法并且带返回值? 如果以上问题都解决了,基本能满足我们游戏

**17.app后端如何保证通讯安全--aes对称加密

在上文<16.app后端如何保证通讯安全--url签名>提到,url签名有两个缺点,这两个缺点,如果使用对称加密方法的话,则完全可以避免这两个缺点.在本文中,会介绍对称加密的具体原理,和详细的方案,使app通讯更加安全. 1.对称加密的原理 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. 其实很简单,假设有原始数据"1000", 把1000加5就得到密文"1005",得到密文"1

Java 对称数据加密AES

昨天呢写了一个非对称数据加密,今天来写对称的数据加密AES.对称数据加密就是只使用一个密钥  进行加密和解密,AES可以使用128,192,和256位密钥. 然后就是我的工具类: public class AESUtil { public static byte[] getKeys(String data){ try { // 创建AES的Key生产者 KeyGenerator kgen = KeyGenerator.getInstance("AES"); // 利用用户密码作为随机数