package com.liusong;
/**
* 对称密钥的生成以及以对象序列化的方式保存
*
*/
import java.io.*;
import javax.crypto.*;
public class Skey_DES
{
public static void main( String[] args ) throws Exception
{
//获取密码生成器
//算法名称可以是Blowfish,DES,DESede,HmacMD5或HmacSHA1
//DES是目前最常用的对称加密算法,改进了的DES算法是DESede,
//Blowfish的密钥长度可达448位
KeyGenerator kg = KeyGenerator.getInstance("DESede");
//初始化密码生成器
//省略该步骤,会根据算法自动生成使用的默认的密钥长度
//DES算法,密钥必须是56位
//若是AES,可以是128,192,256位
//若是Blowfish,则可以是32~448之间可以被8整除的数
//HmacMD5和HmacSHA1默认的长度是64字节
kg.init(168);
//生成密钥
SecretKey k = kg.generateKey();
//通过对象序列化方式将密钥保存在文件中
FileOutputStream f = new FileOutputStream("key1.dat");
ObjectOutputStream b = new ObjectOutputStream(f);
b.writeObject(k);
}
}
或者也可用byte保存到文档
package com.liusong;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
/**
*
* 对称密钥的生成以及以字节的方式保存
*
*/
import javax.crypto.*;
public class Skey_kb {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
//获取密码生成器
//算法名称可以是Blowfish,DES,DESede,HmacMD5或HmacSHA1
//DES是目前最常用的对称加密算法,改进了的DES算法是DESede,
//Blowfish的密钥长度可达448位
KeyGenerator kg = KeyGenerator.getInstance("DESede");
//初始化密码生成器
//省略该步骤,会根据算法自动生成使用的默认的密钥长度
//DES算法,密钥必须是56位
//若是AES,可以是128,192,256位
//若是Blowfish,则可以是32~448之间可以被8整除的数
//HmacMD5和HmacSHA1默认的长度是64字节
kg.init(168);
//生成密钥
SecretKey k = kg.generateKey();
byte[] kb = k.getEncoded();
//密钥字节化后保存在文件中
FileOutputStream f = new FileOutputStream("keykb1.dat");
f.write(kb);
//打印密钥编码中的内容
for(byte b : kb){
System.out.print(b+",");
}
}
}
然后进行加密
package com.liusong;
/**
*
* 使用对称密钥进行加密
*
*/
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
public class SEnc {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// 从文件中获取密钥
FileInputStream f = new FileInputStream("keykb1.dat");
int len = f.available();
byte[] keyByte = new byte[len];
f.read(keyByte);
SecretKeySpec k = new SecretKeySpec(keyByte,"DESede");
//初始化密码器
Cipher cp = Cipher.getInstance("DESede");
cp.init(Cipher.ENCRYPT_MODE, k);
//获取等待加密的明文
String s = "Hello,World!";
byte ptext[] = s.getBytes("UTF-8");
//执行加密
byte ctext[] = cp.doFinal(ptext);
//处理加密结果
FileOutputStream f2 = new FileOutputStream("SEnc.dat");
f2.write(ctext);
}
}
然后进行解密
package com.liusong;
/**
*
* 使用对称密码解密
*
*/
import java.io.*;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class SDec {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
//获取密文
FileInputStream f = new FileInputStream("SEnc.dat");
int num = f.available();
byte[] ctext = new byte[num];
f.read(ctext);
//获取密钥
FileInputStream f2 = new FileInputStream("keykb1.dat");
int len = f2.available();
byte[] keyByte = new byte[len];
f2.read(keyByte);
SecretKeySpec k = new SecretKeySpec(keyByte,"DESede");
//解密
Cipher cp = Cipher.getInstance("DESede");
cp.init(Cipher.DECRYPT_MODE, k);
byte[] ptext = cp.doFinal(ctext);
String s = new String(ptext,"UTF-8");
System.out.println(s);
}
}