Python Tech

Python,Javascript(NodeJS),PHP之间的AES加密解密

场景是现有的几个项目,微信企业号是PHP,广告数据处理平台是Python,其中的Web API部分是NodeJS。现在这几个应用之间要传递数据,基于安全考虑先用AES加密,接收后做解密处理。本来预想是一个很简单的工作,库都是现成的,但发现网上的代码要么是不全,要么是padding处理不一致,所以最后还是自己看文档来写的,分享其中的核心代码,有类似需求可以直接拿去用。

AES

AES的介绍可以参看Wikipedia: 高级加密标准。这种加密方式需要指定Key(密钥)和IV(初始化向量),解密时使用同样的Key和IV进行解密。其次需要padding(填充字符),网上一些代码是用空格或者大括号做padding,解密后再用rstrip/rtrim/replace清掉,但用标准的PKCS会更好。

  • 使用256位的AES,Python会根据传入的Key长度自动选择,在PHP5在mcrypt里是MCRYPT_RIJNDAEL_128,Nodejs/PHP7.1是aes-256-cbc。
  • 使用AES的CBC模式,因为ECB模式用不到IV。
  • 使用PKCS的方式来padding,因为NodeJS的库在auto_padding的状态下使用的也是PKCS。Key用AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA(32个,256位),IV用AAAAAAAAAAAAAAAA(16个,128位)。
  • Python使用pycrypto(pip install pycrypto),NodeJS使用crypto(npm install crypto),PHP需要mcrypt模块。

Python

Javascript(NodeJS)

PHP

Testing

环境: Ubuntu 14.04.2, Python 2.7.6, NodeJS v0.10.25, PHP 5.5.9

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
最新 最旧 得票最多
提醒
bajian
游客
bajian

解决了,楼主写的不对。。加解密都要将update和final 连起来才对。比如
Buffer.concat([
cipher.update(data, ‘utf-8’),
cipher.final()
]).toString(“hex”)

bajian
游客
bajian

楼主贴的nodejs的代码,当加密文本长度大于15就解密失败了,能帮忙看下为啥么,不是很懂加密,谢谢

恋羽
游客

这段代码看了很多遍,才发现走进了一个大坑。php7.1 如何解决兼容问题