java 加密技术(二)
来源:互联网 发布:淘宝永久封店不能购物 编辑:程序博客网 时间:2024/05/11 01:59
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博客
- 本文主要参考moocer老师的java实现对称加密
0 0
- java 加密技术(二)
- Java加密技术(二)
- Java加密技术(二)
- Java加密技术(二)
- Java加密技术(二)
- Java加密技术(二)
- Java加密技术(二)
- Java加密技术(二)
- Java加密技术(二)DES
- 漫谈Java加密技术(二)
- 漫谈Java加密技术(二)
- java加密技术二(DES对称加密算法)
- Java加密技术(二)—对称加密算法DES&AES
- Java加密技术(二)对称加密算法DES&AES
- Java加密技术(二)对称加密算法DES&AES
- 【密钥算法】Java加密技术(二)---DES数据加密算法
- java加密技术--RSA加密
- java加密技术-双向加密
- linux 文件套接字
- 求一个数的阶乘
- Leetcode no. 212
- MySQL 主从同步错误解决
- Linux 常用命令集合
- java 加密技术(二)
- 关于深拷贝和浅拷贝
- 求带环的单链表入口位置处的节点
- WebService笔记(三):SOAP
- 双向链表中基本函数的实现
- 微信网页授权流程总结
- 盘吃蛇
- 线索化二叉树
- 哈希表