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

2 thoughts on “Python,Javascript(NodeJS),PHP之间的AES加密解密”

    1. php文档上一直写有,之后会停止mcrypt_encrypt/decrypt。用openssl代替,比如解密: openssl_decrypt(base64_decode($data), ‘aes-256-cbc’, $this->key, OPENSSL_RAW_DATA, $this->iv);

Leave a Reply

Your email address will not be published. Required fields are marked *