刚刚对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)
### 对称加密技术详解——DES与TripleDES #### 一、对称加密概述 对称加密,作为一种传统而广泛使用的加密方法,其特点是加密和解密过程中使用同一个密钥。这意味着在信息传输过程中,发送方和接收方必须共享同一...
标题"TripleDES.rar_TripleDES_java TripleDES_triple DES_triple DES in"提及的核心是“TripleDES”,这是一个加密算法,它在Java编程环境中被实现。描述简单明了,表明这是一个使用TripleDES算法的程序。 **...
标题中的"TripleDES.zip_DES tripledes_TripleDES java_Tripledes java"表明这是一个关于Java编程中实现三重DES(Triple DES)加密算法的压缩文件。在这个压缩包中,我们主要会探讨DES(Data Encryption Standard)...
TripleDES(三重DES)是一种广泛使用的对称加密算法,它提供了比单个DES更强的安全性。本项目是使用C#编程语言为Windows Phone 7平台编写的TripleDES加解密库,它不仅实现了数据的加密和解密功能,还支持将加密后的...
标题中的"C语言编写的TripleDES加解密库"是指一个使用C编程语言实现的加密库,专注于Triple DES(三重DES)加密算法。Triple DES是一种加强版的DES(数据加密标准)算法,它通过三次应用DES算法来提高安全性,使得...
本程序是本人综合一些加密解密算法,写成的加密解密算法类 其中包括对字符串加密解密、文件加密解密 加密方法有:DES,RC2,Rijndael,TripleDES,C#与java默认的DES加密算 法接口,MD5加密算法 vs2008 C# 源码
Java中的TripleDES是一种广泛使用的对称加密算法,全称为“Triple Data Encryption Algorithm”,即三重数据加密算法。这个算法基于DES(Data Encryption Standard)并增强了其安全性,通过三次迭代加密来提高密码...
标题中的"TripleDES.rar_DES CSharp_des_triple_triple DES_triple d"指的是一个关于Triple DES加密解密技术的C#实现。Triple DES(3DES)是数据加密标准(DES)的一种加强版本,用于提高DES的安全性。在这个压缩包...
坑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”表明这是一个关于使用VB.NET实现的简单TripleDES加密的压缩包文件。TripleDES,全称为Triple Data Encryption Algorithm,是一种加强版的DES(Data ...
**基于TripleDES的文件加密系统详解** 在信息技术领域,数据安全是至关重要的,尤其是在网络通信和数据存储中。为了保护敏感信息不被未经授权的访问,加密技术被广泛使用。本篇将详细介绍一个基于TripleDES(三重...
C#常用加密类包含DES、MD5、RC2、Rijndael、RSA、TripleDES
using System; using System.Collections.Generic; using System.Linq;... namespace WindowsFormsApplication1 { #region TripleDES算法 public class ClassTripleDES { public ClassTripleD
本程序是本人综合一些加密解密算法,写成的加密解密算法类 其中包括对字符串加密解密、文件加密解密 加密方法有:DES,RC2,Rijndael,TripleDES,C#与java默认的DES加密算 法接口,MD5加密算法 vs2008 C# 源码
支持对文本文件,图像文件,压缩文件的加密 因为这是第一个版本,未免有不尽人意的地方,欢迎指正.
压缩包内的"codefans.net"可能是一个网站链接,通常在分享代码或资源时,开发者会提供代码的来源或相关讨论平台。在研究这些Delphi加密解密源代码时,这个链接可能会提供额外的帮助,比如相关的技术文章、论坛讨论或...
TripleDES-演示向您展示如何使用 python 和 php 进行 3DES。