java学习笔记之:java对称加密

来源:互联网 发布:overlay网络百度百科 编辑:程序博客网 时间:2024/05/21 19:33
 
所谓对称加密,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。 加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。
java中常用的4种对称加密方式:DES 3DES AES PBE加解密操作方式分别如下:
-------DES加解密-------------------------------------------------------
public class EncryptDES {
private static String str="encrypt test by des";


/**
* 对称加密之:DES加密
* 数据加密标准DES加密算法是一种对称加密算法,DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位 ,产生最大 64 位的分组大小。
* 这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。
* 使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。
* DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。
* 特点:数据加密标准,速度较快,适用于加密大量数据的场合; 
* @description:
* @date 2015-10-28 下午12:04:18
*/
public static void main(String[] args) {
jdkDes();
}
private static void jdkDes(){
//第一步:生成KEY(密钥)
try {
KeyGenerator keyGenerator=KeyGenerator.getInstance("DES");
keyGenerator.init(56);
SecretKey secretKey=keyGenerator.generateKey();
byte[]bytesKey=secretKey.getEncoded();
//KEY转换
DESKeySpec desKeySpec=new DESKeySpec(bytesKey);
SecretKeyFactory factory=SecretKeyFactory.getInstance("DES");
Key key=factory.generateSecret(desKeySpec);
//进行加密操作
Cipher cipher=Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);//设置为加密MODE
byte[] result=cipher.doFinal(str.getBytes());
System.out.println("用jdk进行DES加密结果:"+Base64.encode(result));

//解密操作
cipher.init(Cipher.DECRYPT_MODE, key);
result=cipher.doFinal(result);
System.out.println("用jdk进行DES加密后解密结果:"+new String(result));

}
catch (Exception e) {
e.printStackTrace();
}
}
}
---------3DES加解密----------------------------------------------------
public class Encrypt3DES {
private static String str="encrypt test by 3des";


/**
* 对称加密之:3DES加密
* 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。
* 它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;
* 3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
* @description:
* @date 2015-10-28 下午12:04:18
*/
public static void main(String[] args) {
jdk3Des();
}
private static void jdk3Des(){
//第一步:生成KEY(密钥)
try {
KeyGenerator keyGenerator=KeyGenerator.getInstance("DESede");
keyGenerator.init(168);
//或者写成keyGenerator.init(new SecureRandom());
SecretKey secretKey=keyGenerator.generateKey();
byte[]bytesKey=secretKey.getEncoded();
//KEY转换
DESedeKeySpec desKeySpec=new DESedeKeySpec(bytesKey);
SecretKeyFactory factory=SecretKeyFactory.getInstance("DESede");
Key key=factory.generateSecret(desKeySpec);
//进行加密操作
Cipher cipher=Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);//设置为加密MODE
byte[] result=cipher.doFinal(str.getBytes());
System.out.println("用jdk进行DES加密结果:"+Base64.encode(result));

//解密操作
cipher.init(Cipher.DECRYPT_MODE, key);
result=cipher.doFinal(result);
System.out.println("用jdk进行3DES加密后解密结果:"+new String(result));

}
catch (Exception e) {
e.printStackTrace();
}
}
}
-----------AES加解密----------------------------------------------
public class EncryptAES {
private static String str="encrypt test by aes";


/**
* 对称加密之:AES加密
* 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
* 这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
* 经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。
* 2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。是目前使用最多的对称加密算法
* 优势之一:至今尚未被破解:通常用于移动通信系统以及基于SSH协议的软件
*/
public static void main(String[] args) {

jdk3Aes();
}
private static void jdk3Aes(){
//第一步:生成KEY(密钥)
try {
KeyGenerator keyGenerator=KeyGenerator.getInstance("AES");
keyGenerator.init(128);//或192/256
//或者写成keyGenerator.init(new SecureRandom());
SecretKey secretKey=keyGenerator.generateKey();
byte[]bytesKey=secretKey.getEncoded();
//KEY转换
Key key=new SecretKeySpec(bytesKey, "AES");
//进行加密操作
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);//设置为加密MODE
byte[] result=cipher.doFinal(str.getBytes());
System.out.println("用jdk进行DES加密结果:"+Base64.encode(result));

//解密操作
cipher.init(Cipher.DECRYPT_MODE, key);
result=cipher.doFinal(result);
System.out.println("用jdk进行AES加密后解密结果:"+new String(result));

}
catch (Exception e) {
e.printStackTrace();
}
}
}
------------------PBE加解密----------------------------------------
public class EncryptPBE {
private static String str="encrypt test by pbe";


/**
* 对称加密之:PBE加密Password-based encryption(基于密码(口令)加密)
* 其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。
* 是一种简便的对称加密方式。 
* PBE算法没有密钥(秘密[对称]密钥)的概念,把密码+盐+消息摘要迭代数当做密钥了。
* 因为密钥长短影响算法安全性,还不方便记忆,这里我们直接换成我们自己常用的密码就大大不同了,便于我们的记忆。
* 但是单纯的密码很容易被字典法给穷举出来,所以我们这里给密码加了点“盐”,这个盐和密码组合,想破解就难了。
* 同时我们将盐和口令合并后用消息摘要算法进行迭代很多次来构建密钥初始化向量的基本材料,使破译更加难了。 
* PBE算法没构建新的加密算法,就是用了我们常用的对称加密算法,例如AES,DES等算法。
* 它是将密钥的概念转成 “口令+盐” 的方式,将不便于记忆的密钥转成便于记忆的口令。
*/
public static void main(String[] args) {

jdkPbe();
}
private static void jdkPbe(){
try {
//初始化加盐
SecureRandom random=new SecureRandom();
byte[]salt=random.generateSeed(8);
//口令与生成KEY(密钥)
String pwd="password";
PBEKeySpec pbeKeySpec=new PBEKeySpec(pwd.toCharArray());
SecretKeyFactory factory=SecretKeyFactory.getInstance("PBEWITHMD5andDES");
Key key=factory.generateSecret(pbeKeySpec);
//进行加密操作
PBEParameterSpec parameterSpec=new PBEParameterSpec(salt, 100);
Cipher cipher=Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE, key,parameterSpec);
byte[] result=cipher.doFinal(str.getBytes());
System.out.println("用jdk进行PBE加密结果:"+Base64.encode(result));

//解密操作
cipher.init(Cipher.DECRYPT_MODE, key);
result=cipher.doFinal(result);
System.out.println("用jdk进行PBE加密后解密结果:"+new String(result));

}
catch (Exception e) {
e.printStackTrace();
}
}
}

0 0
原创粉丝点击