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

 

posted @ 2018-08-31 09:01  dong1  阅读(415)  评论(0编辑  收藏  举报