`
wx1569488408
  • 浏览: 79234 次
文章分类
社区版块
存档分类
最新评论

标准3des加密

 
阅读更多
package com.gzcb.creditcard.txcard.cashout.util;

import sun.misc.BASE64Decoder;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;

/**
 * @author xingguanghui
 * @create 2018-03-21 16:41
 **/
@SuppressWarnings({ "restriction" })
public class ThreeDES {
    private static final String IV = "1234567-";
    public static final String KEY = "123456781234567812345678";

    /**
     * DESCBC加密
     *
     * @param src
     *            数据源
     * @param key
     *            密钥,长度必须是8的倍数
     * @return 返回加密后的数据
     * @throws Exception
     */
    public String encryptDESCBC(final String src, final String key) throws Exception {

        // --生成key,同时制定是des还是DESede,两者的key长度要求不同
        final DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
        final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        final SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

        // --加密向量
        final IvParameterSpec iv = new IvParameterSpec(IV.getBytes("UTF-8"));

        // --通过Chipher执行加密得到的是一个byte的数组,Cipher.getInstance("DES")就是采用ECB模式,cipher.init(Cipher.ENCRYPT_MODE,
        // secretKey)就可以了.
        final Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        final byte[] b = cipher.doFinal(src.getBytes("UTF-8"));

        // --通过base64,将加密数组转换成字符串
        String encode = Base64.encode(b);
        return encode;
    }

    /**
     * DESCBC解密
     *
     * @param src
     *            数据源
     * @param key
     *            密钥,长度必须是8的倍数
     * @return 返回解密后的原始数据
     * @throws Exception
     */
    public String decryptDESCBC(final String src, final String key) throws Exception {
        // --通过base64,将字符串转成byte数组
        byte[] bytesrc = Base64.decode(src);

        // --解密的key
        final DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
        final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        final SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

        // --向量
        final IvParameterSpec iv = new IvParameterSpec(IV.getBytes("UTF-8"));
        // --Chipher对象解密Cipher.getInstance("DES")就是采用ECB模式,cipher.init(Cipher.DECRYPT_MODE,
        // secretKey)就可以了.
        final Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
//        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        final byte[] retByte = cipher.doFinal(bytesrc);

        return new String(retByte);

    }




    // 3DESECB加密,key必须是长度大于等于 3*8 = 24 位哈
    public static String encryptThreeDESECB(final String src, final String key) throws Exception {
//        final DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
        final DESedeKeySpec dks = new DESedeKeySpec(hex2byte(key));


        final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
        final SecretKey securekey = keyFactory.generateSecret(dks);
        final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, securekey);
        final byte[] b = cipher.doFinal(hex2byte(src));
//        final byte[] b = cipher.doFinal(src.getBytes());
        String s = byte2hex(b);
        System.out.println("-->"+s);
        String encode = Base64.encode(b);
        return encode.replaceAll("\r", "").replaceAll("\n", "");
    }

    public static void main(String[] args) {
        try {
            String s = encryptThreeDESECB("3132333435360000", "209DD68C90A2E89032908F0909821343209DD68C90A2E890");
//            String s = encryptThreeDESECB("3132333435360000", "209DD68C90A2E89032908F0909821343209DD68C90A2E890");
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    // 3DESECB解密,key必须是长度大于等于 3*8 = 24 位哈
    public String decryptThreeDESECB(final String src, final String key) throws Exception {
        // --通过base64,将字符串转成byte数组
        final BASE64Decoder decoder = new BASE64Decoder();
        final byte[] bytesrc = decoder.decodeBuffer(src);
        // --解密的key
        final DESedeKeySpec dks = new DESedeKeySpec(key.getBytes("UTF-8"));
        final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
        final SecretKey securekey = keyFactory.generateSecret(dks);

        // --Chipher对象解密
        final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, securekey);
        final byte[] retByte = cipher.doFinal(bytesrc);

        return new String(retByte);
    }


    /**
     * 字节数组转换成16进制字符串
     *
     * @param b
     * @return
     */
    public static String byte2hex(byte[] b) {// 二行制转字符串
        String hs = "";
        String stmp = "";

        for (int n = 0; n < b.length; n++) {
            stmp = byteHEX(b[n]);
            hs = hs + stmp;
        }
        return hs;
    }

    static String byteHEX(byte ib) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        char[] ob = new char[2];
        ob[0] = Digit[(ib >>> 4) & 0X0F];
        ob[1] = Digit[ib & 0X0F];
        String s = new String(ob);
        return s;
    }
    /**
     * 16进制字符串转换成字节数组
     *
     * @param hex
     * @return
     */
    public static byte[] hex2byte(String hex) {
        int len = (hex.length() / 2);
        byte[] result = new byte[len];
        char[] achar = hex.toCharArray();
        for (int i = 0; i < len; i++) {
            int pos = i * 2;
            result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
        }
        return result;
    }

    static byte toByte(char c) {
        byte b = (byte) "0123456789ABCDEF".indexOf(c);
        return b;
    }
}

转载于:https://my.oschina.net/u/3560494/blog/1648699

分享到:
评论

相关推荐

    3DES加密解密工具

    标题中的“3DES加密解密工具”指的是一个用于执行三重数据加密标准(3DES,Triple DES)的软件工具,这种工具通常用于保护敏感数据的安全,确保信息在传输过程中的机密性。3DES是DES(Data Encryption Standard,...

    3DES加密js前端示例

    3DES(Triple Data Encryption Algorithm,三重数据加密算法)是一种强化版的DES(Data Encryption Standard)加密算法,它通过三次应用DES加密过程来提高安全性。在JavaScript中实现3DES加密通常是为了在网络通信中...

    3DES加密解密

    标题中的“3DES加密解密”指的是在信息技术领域中,使用三重数据加密标准(3DES,Triple Data Encryption Standard)进行数据加密和解密的过程。3DES是一种加强版的DES加密算法,它通过三次应用DES的加密过程来提高...

    nodejs实现3des(2倍长)加密方式,与DES加密工具一致

    使用`crypto.createCipheriv`方法创建3DES加密器,需要指定加密算法('des-ede3'代表3DES),初始化向量(IV,通常为随机生成的8字节序列),以及密钥。例如: ```javascript const iv = Buffer.alloc(8, 0); // ...

    3DES加密算法C语言实现

    在C语言中实现3DES加密算法,可以确保在不同平台上的兼容性和一致性,尤其对于需要跨平台操作的应用场景,如将C语言代码移植到Android平台,通过JNI接口与Java代码交互,能够很好地解决加解密结果不一致的问题。...

    3DES加密算法源码

    它相当于是对每个数据块应用三次DES加密算法。 最早的定义了该算法的标准(ANS X9.52,1998年发布)将其描述为“三重数据加密算法(TDEA)”— 即为ANSI X3.92中定义的数据加密算法(DEA)的三次重复操作— 而完全...

    基于3des加密解密工具

    3DES,全称为三重数据加密标准(Triple Data Encryption Algorithm),是DES加密算法的一种强化版本。DES是一种古老的对称加密算法,由IBM在1970年代初开发,后被美国国家标准局采纳为商业和政府的标准。然而,随着...

    3DES 加密类 加密

    在C++中实现3DES加密,需要包含相关库,如`&lt;openssl/des.h&gt;`。首先,你需要创建一个3DES上下文环境,设置密钥,然后可以进行加密和解密操作。以下是一个简化的3DES加密过程: ```cpp #include &lt;openssl/des.h&gt; ...

    3des加密 仅能加密英文 和 txt文件

    标题中的“3DES加密”指的是Triple DES(三重数据加密标准),它是一种广泛使用的对称加密算法,基于DES(Data Encryption Standard)并将其安全性增强了三倍。DES原本使用56位密钥,3DES通过三次独立的DES加密过程...

    des3_3des加密_

    标题中的"des3_3des加密_"表明我们将讨论的是关于Triple Data Encryption Standard(3DES)加密算法,这是一种强化版的DES(Data Encryption Standard)加密算法。DES是一种块密码,最初在1970年代被美国国家标准局...

    3des加密解密

    标题 "3DES加密解密" 涉及到的是数据安全领域中的一种常见的对称加密算法——三重DES(Triple DES)。此算法是基于原始的DES(Data Encryption Standard)算法,通过三次加密过程增强了其安全性。以下是关于3DES及其...

    3des加密3des加密3des加密

    **3DES加密详解** 3DES(Triple DES,也称为TDES或Triple Data Encryption Algorithm)是一种对称加密算法,是DES(Data Encryption Standard)的加强版本。DES最初由IBM开发,于1977年被美国国家标准局(NIST)...

    3DES加密算法C++实现

    总的来说,理解和实现3DES加密算法需要对位操作、循环和模式有深入的理解,同时需要关注加密过程中的安全性和效率。C++代码段可以作为一个学习和研究3DES的实用工具,帮助我们更好地理解加密算法的工作原理。

    3DES加密算法

    为了解决这个问题,3DES应运而生,它通过使用三次DES加密过程增强了安全性。 3DES的加密过程可以分为以下几步: 1. **初始加密**:首先,使用第一个56位密钥(K1)进行一次DES加密。 2. **中间解密**:接着,使用...

    des加密解密_Des加密解密_DES加密_

    在给定的“des加密例程”中,可能包含了一个调用动态链接库(DLL)实现DES加密解密的示例代码。DLL是Windows操作系统中的一种共享库,可以被多个程序同时调用,节省内存资源并便于代码复用。这个示例可能涉及以下...

    delphi版的3DES加密 pkcs5padding填充

    本篇文章将深入探讨Delphi实现的3DES加密以及PKCS5Padding填充方法。 3DES,全称为三重数据加密标准(Triple Data Encryption Standard),是对原有的DES(Data Encryption Standard)算法的加强版。它通过三次应用...

    C++实现3Des算法.zip_3DES算法 C++_3des_C++_visual c_加密算法

    **3DES(Triple DES)算法**,全称为三重...以上就是关于C++中实现3DES加密算法的关键知识点,以及在Visual C++环境下如何使用第三方库进行操作的简要介绍。在实际开发中,还可能涉及到错误处理、性能优化等更多细节。

    实现使用3des在页面js加密,后台java解密

    本篇将详细介绍如何在网页前端使用JavaScript进行3DES加密,并在后端Java环境中进行解密。 一、3DES加密原理 3DES是DES的加强版,它使用了3个不同的56位密钥,通过3次独立的DES加密过程来提高安全性。具体流程如下...

    3des加密字符串文件加密

    1. `My_3DES.rar`: 这个文件可能包含了开发者自定义实现的3DES加密解密功能。可能包括C++、Java、Python或其他编程语言的源代码示例,展示了如何利用3DES算法对字符串或文件进行加解密操作。开发者可能会提供详细的...

    标准的DES加密程序

    DES标准加密程序,用于64位的块加密。

Global site tag (gtag.js) - Google Analytics