Java安全之安全加密算法( 三 )
AESAES是目前用的最多的对称加密算法 , 一般用于移动通讯系统加密或者是基于SSH协议的软件
文章插图
代码实例:package com.demo;import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;import com.sun.xml.internal.messaging.saaj.util.Base64;import sun.misc.BASE64Encoder;import javax.crypto.*;import javax.crypto.spec.SecretKeySpec;import java.security.InvalidKeyException;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;public class aesdemo {private static String name = "xiaoming";public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {//1.获取密钥KeyGenerator aes = KeyGenerator.getInstance("AES");aes.init(128);SecretKey secretKey = aes.generateKey();byte[] encoded = secretKey.getEncoded();//2.密钥转换Key key = new SecretKeySpec(encoded, "AES");//3.加密Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE,key);byte[] bytes = cipher.doFinal(name.getBytes());System.out.println(new BASE64Encoder().encode(bytes));//加密完成后 , 再使用base64进行加密//4.解密cipher.init(Cipher.DECRYPT_MODE,key);byte[] bytes1 = cipher.doFinal(bytes);System.out.println(new String(bytes1));}}下面来放一张基于AES加解密的流程图 。
文章插图
PBEPBE算法(Password Based Encryption , 基于口令加密)是一种基于口令的加密算法 , 其特点是使用口令代替了密钥 , 而口令由用户自己掌管 , 采用随机数杂凑多重加密等方法保证数据的安全性 。 PBE算法在加密过程中并不是直接使用口令来加密 , 而是加密的密钥由口令生成 , 这个功能由PBE算法中的KDF函数完成 。 KDF函数的实现过程为:将用户输入的口令首先通过“盐”(salt)的扰乱产生准密钥 , 再将准密钥经过散列函数多次迭代后生成最终加密密钥 , 密钥生成后 , PBE算法再选用对称加密算法对数据进行加密 , 可以选择DES、3DES、RC5等对称加密算法
文章插图
以上这张图是PBE算法的实现方式
文章插图
代码实例:package com.demo;import com.sun.xml.internal.messaging.saaj.util.Base64;import sun.misc.BASE64Encoder;import javax.crypto.*;import javax.crypto.spec.PBEKeySpec;import javax.crypto.spec.PBEParameterSpec;import java.security.*;import java.security.spec.InvalidKeySpecException;public class pbedemo {private static String name = "xiaoming";public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, BadPaddingException, IllegalBlockSizeException {//1.初始化盐SecureRandom secureRandom = new SecureRandom();byte[] salt = secureRandom.generateSeed(8);//2. 获取密钥String password = "123456";PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");Key key = factory.generateSecret(pbeKeySpec);//3.加密PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, 100);Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");cipher.init(Cipher.ENCRYPT_MODE,key,pbeParameterSpec);byte[] bytes = cipher.doFinal(name.getBytes());System.out.println(new BASE64Encoder().encode(bytes));//4.解密cipher.init(Cipher.DECRYPT_MODE,key,pbeParameterSpec);byte[] res = cipher.doFinal(bytes);System.out.println(new String(res));}}
文章插图
4 、非对称加密算法非对称加密算法需要两个密钥:公钥和私钥 。 公钥]与私钥是一对 , 如果用公钥对数据进行加密 , 只有用对应的私钥才能解密 。 因为加密和解密使用的是两个不同的密钥 , 所以这种算法叫作非对称加密算法 。
DH1976年非对称加密算法思想被提出 , 但是当时并没有给出具体算法和方案 , 因为当时没有研究出单向函数(也就是信息摘要算法还没出现) , 但是IEEE的期刊中给出了通信时双方如何通过信息交换协商密钥的算法 , 也就是DH算法 , 通过该算法双方可以协商对称加密的密钥 。
package com.demo;import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;import javax.crypto.*;import javax.crypto.interfaces.DHPrivateKey;import javax.crypto.interfaces.DHPublicKey;import javax.crypto.spec.DHParameterSpec;import java.security.*;import java.security.spec.InvalidKeySpecException;import java.security.spec.X509EncodedKeySpec;public class dhdemo {private static String name = "xiaoming";public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidAlgorithmParameterException, InvalidKeyException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {//1.初始化发送方密钥KeyPairGenerator sendKeyPairGenerator = KeyPairGenerator.getInstance("DH");sendKeyPairGenerator.initialize(512);KeyPair sendKeyPair = sendKeyPairGenerator.generateKeyPair();byte[] sendPublicKeyEnc = sendKeyPair.getPublic().getEncoded();//生成发送方公钥 , 发送给接收方(网络、文件...)//2.初始化接收方密钥:KeyFactory receiverKeyFactory = KeyFactory.getInstance("DH");X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(sendPublicKeyEnc);PublicKey receivePublicKey = receiverKeyFactory.generatePublic(x509EncodedKeySpec);DHParameterSpec dhParameterSpec = ((DHPublicKey)receivePublicKey).getParams();KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH");receiverKeyPairGenerator.initialize(dhParameterSpec);KeyPair receiverKeyPair = receiverKeyPairGenerator.generateKeyPair();PrivateKey receiverPrivateKey = receiverKeyPair.getPrivate();byte[] receiverPublicKeyEnc = receiverKeyPair.getPublic().getEncoded();//3.构建接收方密钥:KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH");receiverKeyAgreement.init(receiverPrivateKey);receiverKeyAgreement.doPhase(receivePublicKey, true);SecretKey receiverDESKey = receiverKeyAgreement.generateSecret("DES");//接收方Key//4.构建发送方密钥:KeyFactory sendKeyFactory = KeyFactory.getInstance("DH");x509EncodedKeySpec = new X509EncodedKeySpec(receiverPublicKeyEnc);PublicKey sendPublicKey = sendKeyFactory.generatePublic(x509EncodedKeySpec);KeyAgreement sendKeyAgreement = KeyAgreement.getInstance("DH");sendKeyAgreement.init(sendKeyPair.getPrivate());sendKeyAgreement.doPhase(sendPublicKey, true);SecretKey sendDESKey = sendKeyAgreement.generateSecret("DES");//发送方Key//5.发送方加密:Cipher sendCipher = Cipher.getInstance("DES");sendCipher.init(Cipher.ENCRYPT_MODE, sendDESKey);byte[] sendResult = sendCipher.doFinal(name.getBytes());System.out.println("sendResult :"+ HexBin.encode(sendResult));//6.接收方解密:Cipher receiverCipher = Cipher.getInstance("DES");receiverCipher.init(Cipher.DECRYPT_MODE, receiverDESKey);byte[] receiverResult = receiverCipher.doFinal(sendResult);System.out.println("receiverResult : "+new String (receiverResult));}}
- 纠结|硬杠红米Note9Pro?iQOO Z1跌至1575,对比之后纠结了!
- 王兴称美团优选目前重点是建设核心能力;苏宁旗下云网万店融资60亿元;阿里小米拟增资居然之家|8点1氪 | 美团
- 长安|长安傍上华为这个大腿,市值暴涨500亿!可见华为影响力之大?
- 巅峰|realme巅峰之作:120Hz+陶瓷机身+5000mAh 做到了颜值与性能并存
- 蛋壳公寓|官媒发声:绝不能让“割韭菜者”一跑了之!
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 看过明年的iPhone之后,现在下手的都哭了
- 直播销售员|石家庄桥西区插上“互联网+”智慧发展之翼
- 精英|业务流程图怎么绘制?销售精英的经验之谈
- V2X|V2X:确保未来道路交通数据交换的安全性
