des/3des
一、python
1、 des3
python平台的DES3 + base64 加密解密, 有两个常用的库pycrypto和pyDes
1)pycrypto
des3.py
#coding=utf-8
from Crypto.Cipher import _DES3
import base64
import json
BS = _DES3.block_size
def pad(s):
return s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
#定义 padding 即 填充 为PKCS7
def unpad(s):
return s[0:-ord(s[-1])]
class prpcrypt():
def __init__(self, key):
self.key = key
self.mode = _DES3.MODE_CBC #模式为CBC
self.iv = IV #self.iv 为 IV 即偏移量,ECB模式不使用IV
# DES3的加密模式为CBC
def encrypt(self, text):
text = pad(text)
cryptor = _DES3.new(self.key, self.mode, self.iv)
x = len(text) % 8
if x != 0:
text = text + '\0' * (8 - x) # 不满16,32,64位补0
# print(text)
self.ciphertext = cryptor.encrypt(text)
return base64.standard_b64encode(self.ciphertext).decode("utf-8")
# DES3的解密模式为CBC
def decrypt(self, text):
cryptor = _DES3.new(self.key, self.mode, self.iv)
de_text = base64.standard_b64decode(text)
plain_text = cryptor.decrypt(de_text)
# st = str(plain_text.decode("utf-8")).rstrip('\0')
# out = unpad(st)
# return out
#上面注释内容解密如果运行报错,就注释掉试试
return plain_text
if __name__ == '__main__':
#ECB模式不使用IV
IV=b'00000000'
des3 = prpcrypt('123456789012345678901234') # 自己设定的密钥
tick = {
"protocolHead": "gis_fl",
"protocolType": 1000000
}
js = json.dumps(tick) #字典转str,再加密
#js = str(tick)
print type(js)
e = des3.encrypt(js) # 加密内容
d = des3.decrypt(e) #解密内容
print e #加密后
print d #解密后
参考https://www.cnblogs.com/qq405921147/p/9176691.html
2)pyDes
参考
pyDes库
https://www.cnblogs.com/txw1958/archive/2012/07/20/python-des-3des.html
https://blog.csdn.net/sbdxxcjh/article/details/38460409
des3 + base64
https://www.jb51.net/article/112549.htm
aes+base64+pcks5
pip install crypto
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/5/17 17:23 # @Author : tangjiale # @Site : # @File : AESUtil.py from Crypto.Cipher import AES import base64 class AESUtil: @staticmethod def _pad(s): return s + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size) #初始化AES配置参数 @staticmethod def _cipher(key): iv = 'w2wJCnctEG09danP' #AES/ECB/PKCS5Padding return AES.new(key=key, mode=AES.MODE_CBC, IV=iv) #AES加密 def encrypt(self,key,data): encryptd = self._cipher(key).encrypt(self._pad(data)) return base64.encodestring(encryptd) #AES解密 def decrypt(slef,key,data): base64Data = base64.decodestring(data) decryptd = slef._cipher(key).decrypt(base64Data) return (decryptd) if __name__ == '__main__': key = 'xxxxxxxxxxxxxxxx' aesUtil =AESUtil() encStr = aesUtil.encrypt(key,'{"abc":"a123456","kis":"kisCloud2018","name":"金蝶20118蝶金"}') print('Python encrypt: ' + encStr) print('Python decrypt: ' + aesUtil.decrypt(key,'dUFWEbRsKTWPwHHrJLu/vJJhQIbcfjas6TMaMEG+seOhmsdbm0mkxxxxVl01bAgppvScbQ2paGfZYma6tBv7hXfKSA+ntwRaAYAPhxIe3aA='))
二、nodejs
1、 des3加密
在线工具 http://tool.chacuo.net/crypt3des
感谢这位哥,轻轻一百度就有现成的
http://mygo.iteye.com/blog/2018882
var assert = require('assert'); var crypto = require('crypto'); function test_des(param) { var key = new Buffer(param.key); var iv = new Buffer(param.iv ? param.iv : 0) var plaintext = param.plaintext var alg = param.alg var autoPad = param.autoPad //encrypt var cipher = crypto.createCipheriv(alg, key, iv); cipher.setAutoPadding(autoPad) //default true var ciph = cipher.update(plaintext, 'utf8', 'hex'); ciph += cipher.final('hex'); console.log(alg, ciph) //decrypt var decipher = crypto.createDecipheriv(alg, key, iv); decipher.setAutoPadding(autoPad) var txt = decipher.update(ciph, 'hex', 'utf8'); txt += decipher.final('utf8'); assert.equal(txt, plaintext, 'fail'); } test_des({ alg: 'des-ecb', autoPad: true, key: '01234567', plaintext: '1234567812345678', iv: null }) test_des({ alg: 'des-cbc', autoPad: true, key: '01234567', plaintext: '1234567812345678', iv: '12345678' }) test_des({ alg: 'des-ede3', //3des-ecb autoPad: true, key: '0123456789abcd0123456789', plaintext: '1234567812345678', iv: null }) test_des({ alg: 'des-ede3-cbc', //3des-cbc autoPad: true, key: '0123456789abcd0123456789', plaintext: '1234567812345678', iv: '12345678' })
我只用到了3des-ecb,数据格式是base64, 将加密和解密两个函数的数据格式从hex改成base64就OK了。
封装一下
var crypto = require('crypto'); var key_qbox10 = '123456789012345678901234'; function des3Encrypt(param) { var key = new Buffer(param.key); var iv = new Buffer(param.iv ? param.iv : 0) var plaintext = param.plaintext var alg = param.alg var autoPad = param.autoPad var cipher = crypto.createCipheriv(alg, key, iv); cipher.setAutoPadding(autoPad) var ciph = cipher.update(plaintext, 'utf8', 'base64'); ciph += cipher.final('base64'); return ciph; }; function des3Decrypt(param) { var key = new Buffer(param.key); var iv = new Buffer(param.iv ? param.iv : 0) var plaintext = param.plaintext var alg = param.alg var autoPad = param.autoPad var decipher = crypto.createDecipheriv(alg, key, iv); decipher.setAutoPadding(autoPad) var txt = decipher.update(plaintext, 'base64', 'utf8'); txt += decipher.final('utf8'); return txt; }; exports.decode=function(data){ var para = { alg:'des-ede3', autoPad:true, plaintext:data, iv:null, key:key_qbox10 }; var decode_str = des3Decrypt(para); return decode_str; } exports.encode =function(data){ var para = { alg:'des-ede3', autoPad:true, plaintext:data, iv:null, key:key_qbox10 }; var encode_str = des3Encrypt(para); return encode_str; }
demo:
decode
function recv_routine(data){ var obj = JSON.parse(des3.decode(data)); //console.log("<<<<<<<<<<<<<<<<<<<<"+JSON.stringify(obj)); //response tick if( obj.protocolType === 1000000 ){ console.log("<<<<<<<<<<<<<<<<<<<<"+JSON.stringify(obj)); } }
encode
client.connection.sendUTF(des3.encode(JSON.stringify(proto.tick)));
三、可以直接用openssl指令来加密解密
https://blog.csdn.net/jasonhwang/article/details/2336049