BASE64加解密
BASE64是一种比较基本、简单的加密算法,其实BASE64主要作用不是用于加密,BASE64是把与原始的数据转换成另一种编码格式,这样方便在网络上传输。所以严格来说,BASE64并不是安全的加密解密算法,但通过BASE64编码过后原来的数据也会改变成非原来的数据的字符。
例
/*该方法创建BASE64Encoder对象后调用encodeBuffer()方法对数据进行加密
其中 msg 参数表示加密的数据,为byte数组*/
public static String encryptionTest(byte[] msg) {
return new BASE64Encoder().encodeBuffer(msg);
}
//使用BASE64Decoder对象的decodeBuffer()进行解密
public static byte[] decodeTest(String str) throws IOException {
return new BASE64Decoder().decodeBuffer(str);
}
//mian方法中分别调用加密和解密方法对需要加密、解密的数据进行加密、解密
public static void main(String[] args) throws IOException {
String msg = "这是需要加密的字符串";
System.out.println("没有加密之前:"+msg);
String msgOfby = encryptionTest(msg.getBytes());
System.out.println("加密之后的字符串:"+msgOfby);
System.out.println(("解密:")+new String( decodeTest(msgOfby)));
}
效果
使用BASE64加密后的字符串每隔76个字符串就会插入一个回车键(也就是换行,从上图中输出可以看出加密之后的字符串和加密之间空了一行)
注:可能是我使用的是my eclipse,在项目上无法直接使用BASE64Decoder和BASE64Encoder类(sun.misc包下),因为两个类都是在sun.misc包下,属于sun公司内容方法,不属于JDK标准库的范畴,但JDK中包含了该类。
解决方法:右击你的项目,选择Build Path,然后点击Configure Buid Path,出现下面界面,点击JRE System Library后选中Access rules,然后点击Edit
点击Add
Resolution项选为Accessible、RulePattern 填写**,然后点击ok,如下
DES加解密
DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥,使用的是56位密钥,可破解。 例 下面方法对参数str进行加密并返回
public static String Encrypt(String str) throws Exception {
BASE64Encoder encoder=new BASE64Encoder();//实例化
byte[] bytes = str.getBytes("UTF-8");//将加密的字符串按UTF-8编码转为byte[]
Cipher cipher = Cipher.getInstance("DES");// 得到Cipher实例对象
cipher.init(Cipher.ENCRYPT_MODE, key); // 初始化
byte[] doFinalOfBy = cipher.doFinal(bytes); // 对byte进行加密
return encoder.encode(doFinalOfBy); //对byte数组进行编码作String返回
}
下面该方法对参数str进行解密并返回解密后的字符串
public static String Decrypt(String str) throws Exception {
BASE64Decoder decoder = new BASE64Decoder();//实例化
byte[] by = decoder.decodeBuffer(str);
Cipher cipher = Cipher.getInstance("DES");//实例化cipher对象
cipher.init(Cipher.DECRYPT_MODE, key); // 初始化
byte[] doFinal = cipher.doFinal(by); // 解密
// 将解密后的byte数组按UTF-8编码并返回字符串
return new String(doFinal, "UTF-8");
}
main方法
public static void main(String[] args) {
try{
//获取DES算法对象
KeyGenerator generator=KeyGenerator.getInstance("DES");
//SHA1安全策略
SecureRandom secureRandom=SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed("tianYe".getBytes());//设置密钥
generator.init(secureRandom); //初始化基于SHA1的算法对象
key=generator.generateKey();//生成密钥对象
generator=null;
}catch(Exception e){
throw new RuntimeException(e);
}
//加密的字符串
String Username= Encrypt("田野上的风筝");
System.out.println("加密后的UserName:"+Username);
//解密
System.out.println("解密后的UserName:"+Decrypt(Username));
}
运行输出结果
在DES的加解密中操作明文或密文都是调用Cipher中的doFinal()方法,两者调用这个方法的区别在于初始化Cipher时使用的init()方法中的常量,使用Cipher.DECRYPT_MODE表示解密,Cipher.ENCRYPT_MODE常量则表示加密。
PBE对称加密算法(Password Base Encryption):该算法需要一个密码来生成Key,除此之外还需要一个随机数,不管是加密还是解密,必须同时使用Key和这个随机数才能完成加密或解密,这随机数叫作盐,使用盐和Key加密数据后想要破译就更加难了,加密方需要将盐值传输给解密方解密。
关键代码
初始化盐方法(Salt必须是8个字节长)
public static byte[] initSalt() {
byte[] by= new byte[8];
Random random = new Random();//实例化Random对象
random.nextBytes(by);
return by;
}
加密方法,
public static byte[] encryptPBE(byte[] data, String key, byte[] salt) throws Exception {
byte[] bytes = null;
//获取密钥
Key k = stringToKey(key);
//实例化PBE参数材料
PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, 100);
//加密操作
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE, k, parameterSpec);
//执行操作
bytes = cipher.doFinal(data);
return bytes;
}
解密方法
public static byte[] decryptOfPBE (byte[] data, String key, byte[] salt) throws Exception {
byte[] bytes = null;
// 获取密钥
Key key stringToKey(key);
PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, 100);
//解密操作
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
bytes = cipher.doFinal(data);
return bytes;
}
public static Key stringToKey(String key) {//转换密钥
SecretKey secretKey = null;
PBEKeySpec keySpec = new PBEKeySpec(key.toCharArray());
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
secretKey = factory.generateSecret(keySpec); //生成密钥
return secretKey;
}
编写测试方法
public static void main(String[] args) {
// 加密字符串
String msg = "Hi,distant place";
String key = "tianYe"; // key 口令
byte[] by = initSalt();// 初始化盐
// 加密
byte[] encData = encryptOfPBE(msg.getBytes(), key, by);
// 调用方法解密
byte[] decData = decryptOfPBE(encData, key, by);
String encStr = null;
String decStr = null;
try {
encStr = encryptBase64(encData);
decStr = new String(decData, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("加密前的msg:" + msg);
System.out.println("加密后的msg:" + encStr);
System.out.println("解密后的msg:" + decStr);
}
运行效果