zoukankan      html  css  js  c++  java
  • pyDes 实现 Python 版的 DES 对称加密/解密--转

    https://my.oschina.net/leejun2005/blog/586451

    手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓了两下 pyDes 貌似很方便,不过据网上其他同学测试说 PyCrypto 性能要比 pyDes 高一个数量级,这里我没有做具体性能测试,也没有选用 PyCrypto 主要原因有三:

    (1)PyCrypto 在 windows 下依赖 VC++9.0,安装麻烦 

    (2)PyCrypto 默认不支持 padmode,且对秘钥以及偏转向量长度有严格要求,扩展性很差

    (3)不是用来搞暴力破解,性能要求不高,所以就不关注性能了,能用就行  ^ _ ^

    下面直接上代码吧~

    1、Java 版

    public class EncryptHelper {
        private static String strKey = "test_KEY", strParam = "test__IV";
        public static String desEncrypt(String source) throws Exception {
            if (source == null || source.length() == 0)
                return null;
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            DESKeySpec desKeySpec = new DESKeySpec(strKey.getBytes("UTF-8"));
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
            IvParameterSpec iv = new IvParameterSpec(strParam.getBytes("UTF-8"));
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
            return StringHelper.toHexString(
                    cipher.doFinal(source.getBytes("UTF-8"))).toUpperCase();
        }
    
        public static String desDecrypt(String source) throws Exception {
            if (source == null || source.length() == 0)
                return null;
            byte[] src = StringHelper.fromHexString(source);
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            DESKeySpec desKeySpec = new DESKeySpec(strKey.getBytes("UTF-8"));
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
            IvParameterSpec iv = new IvParameterSpec(strParam.getBytes("UTF-8"));
            cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
            byte[] retByte = cipher.doFinal(src);
            return new String(retByte);
        }
    
        public static void main(String[] args) throws Exception {
            System.out
            .println(EncryptHelper
                    .desDecrypt("886f930f65f29132f6ace2683c448b5580d681a1fec3fc91cf3161f074b53b935d1c8fe80f99201077b36f923a42ac0e05cabe579308fda08d8ff463ad334677"));
            System.out.println(EncryptHelper.desEncrypt("https://mail.google.com/mail/u/0/#inbox/a1ed0e2f6f28e06b4361"));
        }
    }
    
    //结果:
    //https://mail.google.com/mail/u/0/#inbox/a1ed0e2f6f28e06b4361
    //886F930F65F29132F6ACE2683C448B5580D681A1FEC3FC91CF3161F074B53B935D1C8FE80F99201077B36F923A42AC0E05CABE579308FDA08D8FF463AD334677
    
    2、Python 版
    # -*- coding:utf-8 -*-
    import sys
    
    reload(sys)
    sys.setdefaultencoding('utf-8')
    from pyDes import *
    from binascii import b2a_hex, a2b_hex
    
    # For Python3, you'll need to use bytes, i.e.:
    #   data = b"Please encrypt my data"
    #   k = des(b"DESCRYPT", CBC, b"", pad=None, padmode=PAD_PKCS5)
    
    data = 'https://mail.google.com/mail/u/0/#inbox/a1ed0e2f6f28e06b4361'
    KEY = "test_KEY"    #密钥
    IV = "test__IV"     #偏转向量
    # 使用DES对称加密算法的CBC模式加密
    k = des(KEY, CBC, IV, pad=None, padmode=PAD_PKCS5)
    d = k.encrypt(data)
    print b2a_hex(d)
    print "Decrypted: %r" % k.decrypt(d)
    
    #结果:
    #886f930f65f29132f6ace2683c448b5580d681a1fec3fc91cf3161f074b53b935d1c8fe80f99201077b36f923a42ac0e05cabe579308fda08d8ff463ad334677
    #Decrypted: ' 
    
    #或者单行命令如下:
    python -c 'from pyDes import *;from binascii import a2b_hex;import sys;print des("test_KEY", CBC, "test__IV", pad=None, padmode=PAD_PKCS5).decrypt(a2b_hex(sys.stdin.readlines()[0].strip()))' <<<886f930f65f29132f6ace2683c448b5580d681a1fec3fc91cf3161f074b53b935d1c8fe80f99201077b36f923a42ac0e05cabe579308fda08d8ff463ad334677
    #https://mail.google.com/mail/u/0/#inbox/a1ed0e2f6f28e06b4361

    3、Refer

    [1] pyDes库 实现python的des加密

    http://www.cnblogs.com/SunboyL/p/pyDes.html

    [2] Cryptography and Python

    http://lenciel.cn/2013/07/cryptography-and-python/

    [3] 加密解密工具类 EncryptUtil

    http://uule.iteye.com/blog/1925046

    [4] implementing DES-X (mode CBC) using PyCrypto

    https://gist.github.com/doublereedkurt/3921909

    [5] python 对字符串的加密解密

    http://www.simonzhang.net/?p=1903

    [6] 数据加密算法

    http://baike.baidu.com/view/878529.htm

    [7] 非对称加密算法

    http://baike.baidu.com/view/1490349.htm

    [8] Pycrypto与RSA密码技术笔记

    http://python.jobbole.com/84094/

  • 相关阅读:
    Nacos启动异常:failed to req API:/api//nacos/v1/ns/instance after all servers([127.0.0.1:8848])
    多节点集群思路
    内网dns配置
    MySQL集群配置思路
    pycharm常用快捷键
    2020年11月新版CKA考试心得
    JavaScript的Map、Set、WeakMap和WeakSet
    AJAX传输二进制数据
    linux性能监测与优化的指令
    八千字硬核长文梳理Linux内核概念及学习路线
  • 原文地址:https://www.cnblogs.com/davidwang456/p/8964016.html
Copyright © 2011-2022 走看看