18910140161

PYTHON,JAVASCRIPT(NODEJS),PHP之间的AES加密解密

顺晟科技

2021-06-16 10:58:14

204

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

俄歇电子能谱

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

使用256位的AES,Python会根据传入的钥匙长度自动选择,在PHP5在外链里是MCRYPT_RIJNDAEL_128,Nodejs/PHP7.1是aes-256-cbc。

使用俄歇电子能谱的加拿大广播公司模式,因为英国板球理事会模式用不到四。

使用PKCS的方式来填充,因为开发的库在自动填充(_ p)的状态下使用的也是PKCS。钥匙用aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa个,256位),四用aaaaaaaaaaaaaaaaaaaaaa(16个,128位)。

计算机编程语言使用pycrypto(pip install pycrypto),NodeJS使用加密(npm安装加密),PHP需要外链模块。

计算机编程语言

计算机编程语言

2

3

5

6

8

9

10

11

12

13

14

15

16

17

18

19

来自加密。密码导入俄歇电子能谱

导入base64

def _ pad :返回s(AES。block _ size-len % AES。block _ size)* chr(AES。block _ size-len % AES。块大小)

def _cipher():

key=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa '

iv=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa '

返回AES.new(key=key,mode=AES .MODE_CBC,IV=iv)

def encrypt_token(数据):

return _密文().加密(_pad(数据))

def decrypt_token(数据):

return _密文().解密(数据)

if __name__=='__main__':

打印(' Python加密: ' base64。b64编码(encrypt _ token(' dmyz。org’))

print(' Python decrypt : ' decrypt _ token(base64。b 64解密(' FSfhJ/gk3iejopvlyfvc 2q='='))

Javascript(NodeJS)

Java脚本语言

2

3

5

6

8

9

10

11

12

13

14

15

16

17

18

var crypto=require('crypto '),

key=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

iv=' AAAAAAAAAAAAAAAAAAAA

函数encrypt_token(数据){

var cipher=crypto。CreateCipheriv(' AES-256-CBC ',密钥,iv);

cipher.update(数据,“二进制”,“base64”);

返回密码。final(' base64 ');

}

函数decrypt_token(数据){

var decrypt=crypto。createdecidepheriv(' AES-256-CBC ',密钥,iv);

宣布。update(数据,' base64 ',' binary ');

返回声明。final(' binary ');

}

控制台。log(' NodeJS encrypt : ',encrypt _ token(' dmyz。org’);

控制台。log(' NodeJS decrypt : ',decrypt _ token(' FSfhj/gk3iejopvlyfvc 2q='=');

Java脚本语言

2

3

5

6

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

//NodeJS v 0.8 https://github。com/joyent/node/wiki/Api-changes-介于-v 0.8和-v 0.10之间

var crypto=require('crypto '),

key=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

iv=' AAAAAAAAAAAAAAAAAAAA

函数encrypt_token(数据){

var encrypt=crypto。CreateCipheriv(' AES-256-CBC ',密钥,iv),

buffer=Buffer.concat([

encipher.update(数据),

encipher.final()

]);

返回缓冲区。ToString(' base64 ');

}

函数decrypt_token(数据){

var decrypt=crypto。createdecidepheriv(' AES-256-CBC ',密钥,iv),

buffer=Buffer.concat([

解密。更新(缓冲区。自(数据,' base64 ')),

decipher.final()

]);

返回缓冲区。ToString();

}

控制台。log(' NodeJS encrypt : ',encrypt _ token(' dmyz。org’);

控制台。log(' NodeJS decrypt : ',decrypt _ token(' FSfhj/gk3iejopvlyfvc 2q='=');

服务器端编程语言(专业超文本预处理器的缩写)

服务器端编程语言(专业超文本预处理器的缩写)

2

3

5

6

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

?服务器端编程语言(专业超文本预处理器的缩写)

俄歇电子能谱类

{

var $ key=' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ';

var $ iv=' AAAAAAAAAAAAAAAA

函数Encryptoken($ data)

{

$ padding=16-(strlen($ data)% 16);

$数据. str_repeat(chr($padding),$ padding);

返回MCRYPT _ encrypt(MCRYPT _ RIJNDAEL _ 128,$this-key,$data,MCRYPT_MODE_CBC,$ this-iv);

}

函数decrytoken($ data)

{

$ data=MCRYPT _ decrypt(MCRYPT _ RIJndael _ 128,$this-key,base64_decode($data),MCRYPT_MODE_CBC,$ this-iv);

$ padding=order($ data[strlen($ data)-1]);

返回substr($data,0,-$ padding);

}

}

if (php_sapi_name()==='cli ')

{

$ AES=新AES();

echo(' PHP encrypt : '。base64 _ encode($ AES-Encryptoken(' dmyz。org '))).\ n ';

echo ('PHP decrypt: ' .$ AES-decrytoken(' FSfhj/Gk3ieJopvlyfvc 2q==')。\ n ';

}

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航