java加密技术(二)
java 加密技术(二)
1 对称加密算法
1.1 介绍
- 对称加密算法是说加密秘钥与解密秘钥使用的是同一把.
- 他是属于初等(初级)加密算法, 使用范围广,使用频率高 .
- 常用对称加密算法有
- DES
- 3DES
- AES
- PBE
- IDEA
2 DES算法
2.1 介绍
DES (Data Encryption Standard) 数据加密标准. 由美国国家标准性研究所提供, 但是自98年之后,已经被破解,安全性较差. 所以现在项目中不推荐使用DES.
默认秘钥长度56位
2.2 代码实现
package secret;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Hex;
public class DESTest {
public static String src ="i am gc DES";
public static void main(String[] args) {
System.out.println("====jdkDES实现====");
jdkDES();
System.out.println("=================");
//运行结果
/*
====jdkDES实现====
生成的DES秘钥:e5312a52d93b8325
加密之后的结果0b980d14f67e7e2dbf3bf45e5edc5c11
解密之后的结果:i am gc DES
=================
*/
}
public static void jdkDES(){
try {
//由DES算法生成算法生成器KeyGenerator
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
//由算法生成器生成秘钥
SecretKey secretKey = keyGenerator.generateKey();
//将秘钥转成byte数组
byte[] byteKey = secretKey.getEncoded();
//将byte数组十六进制转换成字符串
System.out.println("生成的DES秘钥:"+Hex.encodeHexString(byteKey));
//加密
Cipher cipher = Cipher.getInstance("DES");
//加密初始化,传入加密模式和秘钥
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("加密之后的结果"+Hex.encodeHexString(result));
//进行byteKey的转换
//先将byteKey生成DESKeySpec
DESKeySpec desKeySpec = new DESKeySpec(byteKey);
//再制造DES秘钥工厂
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
//由秘钥工厂将deskeyspec加工成SecretKey
//此时的secreteKey2与secreteKey是相等的
SecretKey secretKey2 = secretKeyFactory.generateSecret(desKeySpec);
//解密
//初始化cipher,解密模式,传入秘钥
cipher.init(Cipher.DECRYPT_MODE, secretKey2);
//开始解密
result = cipher.doFinal(result);
//输出
System.out.println("解密之后的结果:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果感兴趣的话可以多次运行,比较秘钥内容,发现每次生成的秘钥都不一样
3 三重DES
3.1 介绍
三重DES是对DES的补充,在密钥长度与迭代次数都有所加强
3.2 代码实现
package secret;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import org.apache.commons.codec.binary.Hex;
public class SDESTest {
public static String src = "i am 3DES";
public static void main(String[] args) {
System.out.println("====jdk3DES实现====");
jdk3DES();
System.out.println("=================");
//运行结果
/*====jdk3DES实现====
生成的秘钥为:e37616b6d920151637927c5ecb10abf2c46262bf34522abf
加密之后的结果:75e21263547078139f0953e45e5aa683
解密之后的结果:i am 3DES
=================
*/
}
public static void jdk3DES(){
//生成Key
try {
//用DESede来实例化三重DES
KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
//生成秘钥
SecretKey secretKey = keyGenerator.generateKey();
//获取秘钥到byte数组里
byte[] byteKey = secretKey.getEncoded();
//输出秘钥
System.out.println("生成的秘钥为:"+Hex.encodeHexString(byteKey));
//加密
Cipher cipher = Cipher.getInstance("DESede");
//根据秘钥进行加密
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
//输出加密之后的密文
byte[] result = cipher.doFinal(src.getBytes());
//输出加密结果
System.out.println("加密之后的结果:"+Hex.encodeHexString(result));
//将byteKey转换成秘钥
//根据byteKey生成3DES秘钥规范
DESedeKeySpec deSedeKeySpec = new DESedeKeySpec(byteKey);
//创建3DES秘钥工厂
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DESede");
//生产秘钥
SecretKey secretKey2 = secretKeyFactory.generateSecret(deSedeKeySpec);
//解密
cipher.init(Cipher.DECRYPT_MODE, secretKey2);
result = cipher.doFinal(result);
System.out.println("解密之后的结果:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
4 AES加密算法
4.1 介绍
为什么有了3DES还要出现AES呢?因为3DES处理效率比较慢,所以产生AES.
AES应用更加广泛,到目前,还没有官方报道AES被破解
4.2 代码实现
package secret;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
public class AESTest {
public static String src = "i am AES";
public static void main(String[] args) {
jdkAES();
//运行结果
/*
生成的秘钥为:4a4cb6b6cffc650cc4f7010d939a64f8
加密后的结果:740bc2b2535a401eec755326a25ca134
解密后的结果:i am AES
*/
}
public static void jdkAES(){
try {
//生成秘钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
//初始化KeyGenerator,密钥长度默认
keyGenerator.init(new SecureRandom());
//生成秘钥
SecretKey secretKey = keyGenerator.generateKey();
//生成byte数组
byte[] byteKey = secretKey.getEncoded();
//输出
System.out.println("生成的秘钥为:"+Hex.encodeHexString(byteKey));
//加密
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("加密后的结果:"+Hex.encodeHexString(result));
//byteKey转换
//AES的Key转换与DES有点区别
Key key = new SecretKeySpec(byteKey, "AES");
//解密
cipher.init(Cipher.DECRYPT_MODE, key);
result = cipher.doFinal(result);
System.out.println("解密后的结果:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
5 PBE加密
5.1 介绍
PBE加密算法结合了"消息摘要"算法与"对称加密"算法的优势
PBE ( Password Based Encrtption) 基于口令的加密技术
5.2 代码实现
package secret;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.asn1.pkcs.PBEParameter;
public class PBETest {
public static String src = "i am gc PBE";
public static void main(String[] args) {
jdkPBE();
//运行结果
/*
* 加密之后的结果:e9c7035f7c54def110404a3218ed351d
* 解密之后的结果:i am gc PBE
*/
}
public static void jdkPBE() {
try {
// 初始化盐
SecureRandom random = new SecureRandom();
// 产生一个8位的盐,盐必须8位长度
byte[] salt = random.generateSeed(8);
// 创建口令
String password = "gc";
// 将口令转换成秘钥
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
// PBEWITHMD5andDES产生秘钥工厂
SecretKeyFactory secretKeyFactory = SecretKeyFactory
.getInstance("PBEWITHMD5andDES");
// 产生Key
Key key = secretKeyFactory.generateSecret(pbeKeySpec);
// 加密
// 产生PBE参数, 用盐和迭代次数初始化
PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, 100);
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("加密之后的结果:" + Hex.encodeHexString(result));
// 解密
cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpec);
result = cipher.doFinal(result);
System.out.println("解密之后的结果:" + new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 文章中避免不了错误的出现,如果有读者发现文章中的错误,或者有疑问的地方,请留言/Email To Gc
- 请转发OR复制的同学,标注出处,尊重作者劳动成果,谢谢亲 博客迁移自 GC-CSDN
- 本文主要参考moocer老师的java实现对称加密