项目中药使用加密的东西,我在网上找了点资料(就是剽窃人家的代码) 然后自己整理哈,现在把代码贴在这里以后好用。
/**
* @Title Encryption.java ,By yangtao at 2011-3-4上午10:37:55
* @version 1.0
*
* @Description this is you mark
* @Company Copyright (c) 2010 AOSA TECH, Ltd. All right reserved
* @Project SafeMedia
*
*/
package aosa.safemedia.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
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 com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* @Title Encryption
* @author yangtao at 2011-3-4上午10:38:00
* @Description 用于对字符串加密使用。
*/
public class Encryption {
/**
* @Description 加密的时候要使用的密钥,这个方法就是生成一个密钥并保存在文件中
* 这个每次生成的密钥都不同,所以这个生成一次就行了,在写入文件的时候应该判断这个文件是否存在,这样是否更合理。
*/
private void createKey() {
try {
// 得到密钥的实例 以什么方式加密。加密的方式比较多。
KeyGenerator kg = KeyGenerator.getInstance("DES");
kg.init(56);
SecretKey key = kg.generateKey();
// 将生成的密钥对象写入文件。
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
new FileOutputStream(new File("e:\\key.obj")));
objectOutputStream.writeObject(key);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @param KeyFilePath
* 密钥Key对象的路径。注意使用该方法的时候,确保你已经生成了密钥。
* @return
* @Description 从文件中读出Key,用于加密使用。
*/
private static Key getKey(String KeyFilePath) {
Key key = null;
try {
// 将生成的密钥对象从文件中读取出来,然后再强制转换成一个密钥对象。
ObjectInputStream objectInputStream = new ObjectInputStream(
new FileInputStream(new File(KeyFilePath)));
key = (Key) objectInputStream.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return key;
}
/**
* @param source
* @return 放回一个byte数组,为什么不放回字符串,是因为解密的时候要传入这个byte数组才能进行解密,如果解密的时候传入的是字符串
* 那么就会出错,愿意是编码的问题。
* @Description 将传入的字符串进行加密 下面写了将这种byte数组转换成字符串的方法。直接在调用就行了。
*/
public byte[] encrypt(String source) {
byte[] target = null;
try {
byte[] center = source.getBytes("UTF-8");
Key key = getKey("e:\\key.obj");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
target = cipher.doFinal(center);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return target;
}
/**
* @param source
* 加密后的byte数组。可用加密方法encrypt(“String”)生成即可
* @return 解密后的字符串。
* @Description 解密算法。
*/
public byte[] decrypt(byte[] source) {
byte[] dissect = null;
try {
Key key = getKey("e:\\key.obj");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key);// 使用私钥解密
dissect = cipher.doFinal(source);
} 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 dissect;
}
/**
* @param bytes
* @Description 用于把加密后的byte[]数组采用特定的方式写入到文件。
*/
public void encodeByteToFile(byte[] bytes){
BASE64Encoder base64encoder = new BASE64Encoder();
try {
base64encoder.encode(bytes,new FileOutputStream(new File("D:\\t.txt")));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @return
* @Description 由于加密之前采用了编码的格式 所以现在采用特点的方式读出来 ,然后得到用一个byte[]用于解码。
*/
public byte[] getByteFromFile(){
BASE64Decoder base64decoder = new BASE64Decoder();
byte[] encodeByte = null;
try {
encodeByte = base64decoder.decodeBuffer(new FileInputStream(new File("D:\\t.txt")));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return encodeByte;
}
/**
* @param b
* @param filePath
* @Description 将指定的字节写入到文件中。
*/
public void writeByteToFile(byte[] b, String filePath) {
File file = new File(filePath);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fileOutputStream;
try {
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(b);
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//测试使用。
// public static void main(String[] args) {
// Encryption encryption = new Encryption();
// //encryption.dateEncrypt(encryption.encrypt("yangtao"));
// System.out.println(new String(encryption.decrypt(encryption.getByteFromFile())));
// }
}
代码写的也不怎么好,只是吧功能实现了。以后功底后了明白了再来修改。