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/

  • 相关阅读:
    Python 模块 itertools
    Python 字符串的encode与decode
    python 模块 hashlib(提供多个不同的加密算法)
    暴力尝试安卓gesture.key
    hdu 1300 Pearls(DP)
    hdu 1232 畅通工程(并查集)
    hdu 1856 More is better(并查集)
    hdu 1198 Farm Irrigation(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 3038 How Many Answers Are Wrong(并查集)
  • 原文地址:https://www.cnblogs.com/davidwang456/p/8964016.html
Copyright © 2011-2022 走看看