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/

  • 相关阅读:
    Asp.net2.0 中自定义过滤器对Response内容进行处理 dodo
    自动化测试工具 dodo
    TestDriven.NET 2.0——单元测试的好助手(转) dodo
    JS弹出窗口的运用与技巧 dodo
    ElasticSearch 简介 规格严格
    修改PostgreSQL字段长度导致cached plan must not change result type错误 规格严格
    Linux系统更改时区(转) 规格严格
    mvn编译“Cannot find matching toolchain definitions for the following toolchain types“报错解决方法 规格严格
    ElasticSearch 集群 & 数据备份 & 优化 规格严格
    Elasticsearch黑鸟教程22:索引模板的详细介绍 规格严格
  • 原文地址:https://www.cnblogs.com/davidwang456/p/8964016.html
Copyright © 2011-2022 走看看