`

sample code about TripleDES

阅读更多
刚刚对triple-DES 研究了一下,整理出了下面的代码:
package com.nxj.cpp.usersecurity.common.util;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.StringTokenizer;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;

/**
 * The class is encryption/decryption the password by "Triple-DES" Algorithm.
 * @author justin.gong
 *
 */
public class TripleDES {
    
    /**
     * the file store key.
     */
    private static File keyFile = new File("./secretKey");

    /**
     * store the key Object.
     */
    private static SecretKey key = null;

    static {
        try {
            if (!keyFile.exists()) {
                key = generateKey();
                writeKey(key, keyFile);
            } else {
                key = readKey();
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
    }

    /**
     * Generate a secret TripleDES encryption/decryption key.
     */
    private static SecretKey generateKey() throws NoSuchAlgorithmException {
        // Get a key generator for Triple DES (a.k.a DESede)
        KeyGenerator keygen = KeyGenerator.getInstance("DESede");
        // Use it to generate a key
        return keygen.generateKey();
    }

    /**
     * Save the specified TripleDES SecretKey to the specified file.
     * @param key
     * @param file
     * @throws IOException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeySpecException
     */
    private static void writeKey(SecretKey key, File file) throws IOException,
            NoSuchAlgorithmException, InvalidKeySpecException {
        // Convert the secret key to an array of bytes like this
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
        DESedeKeySpec keyspec = (DESedeKeySpec) keyfactory.getKeySpec(key,
                DESedeKeySpec.class);
        byte[] rawkey = keyspec.getKey();

        // Write the raw key to the file
        FileOutputStream out = new FileOutputStream(file);
        out.write(rawkey);
        out.close();
    }

    /**
     * Read a TripleDES secret key from the specified file.
     * @return key created according to the keyfile
     * @throws IOException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws InvalidKeySpecException
     */
    private static SecretKey readKey() throws IOException,
            NoSuchAlgorithmException, InvalidKeyException,
            InvalidKeySpecException {
        // Read the raw bytes from the keyfile
        DataInputStream in = new DataInputStream(new FileInputStream(keyFile));
        byte[] rawkey = new byte[(int) keyFile.length()];
        in.readFully(rawkey);
        in.close();

        // Convert the raw bytes to a secret key like this
        DESedeKeySpec keyspec = new DESedeKeySpec(rawkey);
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
        SecretKey key = keyfactory.generateSecret(keyspec);
        return key;
    }

    /**
     * encrypt the password.
     * @param password
     * @return password after encrypt
     */
    public static String encrypt(String password) {
        String encodedPassword = null;
        try {
            if ((password != null) && (!"".equals(password.trim()))
                    && (key != null)) {
                Cipher cipher;
                cipher = Cipher.getInstance("DESede");
                cipher.init(Cipher.ENCRYPT_MODE, key);
                byte[] cleartext = password.getBytes();
                byte[] ciphertext = cipher.doFinal(cleartext);
                StringBuffer buf = new StringBuffer();
                for (int i = 0; i < ciphertext.length; i++) {
                    buf.append(Byte.toString(ciphertext[i]) + "|");
                }
                encodedPassword = buf.toString();
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return encodedPassword;
    }

    /**
     * decrypt the password.
     * @param password
     * @return password after decrypt
     */
    public static String decrypt(String password) {
        String decodedPassword = null;
        if ((password != null) && (!"".equals(password.trim()))
                && (key != null)) {
            ArrayList<String> list = new ArrayList<String>();
            StringTokenizer toker = new StringTokenizer(password, "|");
            while (toker.hasMoreElements()) {
                list.add(toker.nextToken());
            }
            byte[] cleartext = new byte[list.size()];
            int i = 0;
            for (Iterator iter = list.iterator(); iter.hasNext();) {
                String element = (String) iter.next();
                cleartext[i] = Byte.parseByte(element);
                i++;
            }

            Cipher cipher;
            try {
                cipher = Cipher.getInstance("DESede");
                cipher.init(Cipher.DECRYPT_MODE, key);
                byte[] ciphertext = cipher.doFinal(cleartext);
                decodedPassword = new String(ciphertext);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            }
        }
        return decodedPassword;
    }
}


分享到:
评论

相关推荐

    TripleDES加密解密算法的实现(JAVA)

    TripleDES加密解密算法的实现(JAVA)

    对称加密DES和TripleDES

    ### 对称加密技术详解——DES与TripleDES #### 一、对称加密概述 对称加密,作为一种传统而广泛使用的加密方法,其特点是加密和解密过程中使用同一个密钥。这意味着在信息传输过程中,发送方和接收方必须共享同一...

    TripleDES.rar_TripleDES_java TripleDES_triple DES_triple DES in

    标题"TripleDES.rar_TripleDES_java TripleDES_triple DES_triple DES in"提及的核心是“TripleDES”,这是一个加密算法,它在Java编程环境中被实现。描述简单明了,表明这是一个使用TripleDES算法的程序。 **...

    TripleDES.zip_DES tripledes_TripleDES java_Tripledes java

    标题中的"TripleDES.zip_DES tripledes_TripleDES java_Tripledes java"表明这是一个关于Java编程中实现三重DES(Triple DES)加密算法的压缩文件。在这个压缩包中,我们主要会探讨DES(Data Encryption Standard)...

    Windows Phone 7平台使用C#编写的TripleDES加解密库

    TripleDES(三重DES)是一种广泛使用的对称加密算法,它提供了比单个DES更强的安全性。本项目是使用C#编程语言为Windows Phone 7平台编写的TripleDES加解密库,它不仅实现了数据的加密和解密功能,还支持将加密后的...

    C语言编写的TripleDES加解密库

    标题中的"C语言编写的TripleDES加解密库"是指一个使用C编程语言实现的加密库,专注于Triple DES(三重DES)加密算法。Triple DES是一种加强版的DES(数据加密标准)算法,它通过三次应用DES算法来提高安全性,使得...

    加密解密源码(DES,RC2,Rijndael,TripleDES,MD5)

    本程序是本人综合一些加密解密算法,写成的加密解密算法类 其中包括对字符串加密解密、文件加密解密 加密方法有:DES,RC2,Rijndael,TripleDES,C#与java默认的DES加密算 法接口,MD5加密算法 vs2008 C# 源码

    Java_TripleDES.rar_3des_3des java_Tripledes java_java TripleDES

    Java中的TripleDES是一种广泛使用的对称加密算法,全称为“Triple Data Encryption Algorithm”,即三重数据加密算法。这个算法基于DES(Data Encryption Standard)并增强了其安全性,通过三次迭代加密来提高密码...

    TripleDES.rar_DES CSharp_des_triple_triple DES_triple d

    标题中的"TripleDES.rar_DES CSharp_des_triple_triple DES_triple d"指的是一个关于Triple DES加密解密技术的C#实现。Triple DES(3DES)是数据加密标准(DES)的一种加强版本,用于提高DES的安全性。在这个压缩包...

    兼容C# VB.net的TripleDES加解密的java源码

    坑1:Java的字节从-128到127,因此给其赋值超过127会报错;DotNET的字节从0-256,无此问题。 坑2:Java没有PKCS7Padding,只有PKCS5Padding。因此DotNET的BlockSize只有为8,才可与Java兼容。 坑3:Java的字符串转...

    TripleDES Encrypt.rar_Encrypt_easy _vb.net

    标题中的“TripleDES Encrypt.rar_Encrypt_easy _vb.net”表明这是一个关于使用VB.NET实现的简单TripleDES加密的压缩包文件。TripleDES,全称为Triple Data Encryption Algorithm,是一种加强版的DES(Data ...

    基于TripleDES的文件加密系统(更正版)

    **基于TripleDES的文件加密系统详解** 在信息技术领域,数据安全是至关重要的,尤其是在网络通信和数据存储中。为了保护敏感信息不被未经授权的访问,加密技术被广泛使用。本篇将详细介绍一个基于TripleDES(三重...

    C#常用加密类DES、MD5、RC2、Rijndael、RSA、TripleDES

    C#常用加密类包含DES、MD5、RC2、Rijndael、RSA、TripleDES

    asp.net TripleDES加密、解密算法

    using System; using System.Collections.Generic; using System.Linq;... namespace WindowsFormsApplication1 { #region TripleDES算法 public class ClassTripleDES { public ClassTripleD

    文件、字符串加密解密(DES,RC2,Rijndael,TripleDES,MD5)

    本程序是本人综合一些加密解密算法,写成的加密解密算法类 其中包括对字符串加密解密、文件加密解密 加密方法有:DES,RC2,Rijndael,TripleDES,C#与java默认的DES加密算 法接口,MD5加密算法 vs2008 C# 源码

    基于TripleDES的文件加密系统(FES v1.0)

    支持对文本文件,图像文件,压缩文件的加密 因为这是第一个版本,未免有不尽人意的地方,欢迎指正.

    一个演示Delphi的数据加密技术:文本加密解密源代码..rar

    压缩包内的"codefans.net"可能是一个网站链接,通常在分享代码或资源时,开发者会提供代码的来源或相关讨论平台。在研究这些Delphi加密解密源代码时,这个链接可能会提供额外的帮助,比如相关的技术文章、论坛讨论或...

    TripleDES-demo:向您展示如何使用 python 和 php 进行 3DES

    TripleDES-演示向您展示如何使用 python 和 php 进行 3DES。

Global site tag (gtag.js) - Google Analytics