zoukankan      html  css  js  c++  java
  • 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 + '' * (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('')         
            # 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

  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/dong1/p/9563840.html
Copyright © 2011-2022 走看看