目前加密算法中分两种

一种是对称加密,一种是非对称加密

那么什么是对称加密呢?对称加密可以理解为加密和解密用的是一个钥匙。

而非对称加密,加锁用的是一个钥匙,而解锁用的是另外一个钥匙。

目前市面上用的比较多的对称加密,比如Md5,SHA,AES下面就直接上代码

所需要引入的包为:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigInteger;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.LinkedHashMap;
import java.util.Map;

写代码之前,要写一个工具类Base64,为什么要这个类呢?因为我们不管 是对称加密

还是非对称加密,他加密后返回的默认都是二进制字节类型的。这种数据我们拿到也看不懂

所以,一般有两种解决方案第一种就是通过Base64把二进制字节转为字符串,另一种就是转为16进制字符串

这里我就以Base64作为转换,在写一个解码的。因为某些加密算法需要传入的 是二进制字节

public class Base64Util {
//转换为Base64
public static String base64Enc(byte[] msg) {
return Base64.getEncoder().encodeToString(msg);
}
//解码
public static byte[] base64Dec(String msg) {
return Base64.getDecoder().decode(msg);
}
}

-----------------Md5加密代码

public class EncryptUtil {

public static final String SHA1 = "SHA-1";
public static final String SHA256 = "SHA-256";
public static final String SHA512 = "SHA-512";
public static final String ENCODING = "UTF-8";

//公钥
public static final String PUBKEY = "publicKey";
//私钥
public static final String PRIKEY = "privateKey";

public static String md5Enc(String msg) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(msg.getBytes(ENCODING));
return new BigInteger(1, digest.digest()).toString(16);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}    

-------------------SHA加密代码,参数是一个 SHA类型,目前有 1,256,521.z还有一个需要加密的字符串

具体代码为:

public static String SHAEnc(String type, String msg) {
try {
MessageDigest digest = MessageDigest.getInstance(type);
digest.update(msg.getBytes(ENCODING));
return new BigInteger(1, digest.digest()).toString(16);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

测试结果

------------------------------AES 加密算法。 这个是需要密钥生成器的。自己可以保管密钥。如果下要破解,必须

知道加密方式和密钥。相对前面两个安全级别要高许多

public static byte[] createAESKey() {
try {
// 创建秘钥生成器
KeyGenerator generator = KeyGenerator.getInstance("AES");
// 完成秘钥初始化 AES的128
generator.init(128);
// 生成秘钥
SecretKey key = generator.generateKey();
return key.getEncoded();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

// AES加密 返回值base64
public static String AESEnc(byte[] key, String msg) {
// 转换秘钥
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
try {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] r = cipher.doFinal(msg.getBytes(ENCODING));
return Base64Util.base64Enc(r);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// AES解密
public static String AESDec(byte[] key, String msg) {
// 转换秘钥
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
try {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] r = cipher.doFinal(Base64Util.base64Dec(msg));
return new String(r, ENCODING);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

继续测试

以上的加密方式都是对称加密。只要拿到密钥就会有风险。

下面介绍一款号称最安全的加密方式 就是RSA加密 公钥加密  私钥解密

或者私钥加密 公钥解密。一般来说都是私钥加密 ,公钥解密 不废话直接上代码

// RSA
// 创建秘钥
// 创建秘钥 1024
public static Map<String, String> createRSAKey() {
try {
// 创建秘钥生成器
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
// 完成秘钥初始化
generator.initialize(1024);
// 生成秘钥
KeyPair keyPair = generator.generateKeyPair();

Map<String, String> map = new LinkedHashMap<String, String>();
// 获取公钥
map.put(PUBKEY, Base64Util.base64Enc(keyPair.getPublic().getEncoded()));
// 获取私钥
map.put(PRIKEY, Base64Util.base64Enc(keyPair.getPrivate().getEncoded()));
return map;
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// 获取公钥
public static PublicKey getPubKey(String key) {
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64Util.base64Dec(key));
return (PublicKey) keyFactory.generatePublic(keySpec);
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
// 获取私钥
public static PrivateKey getPriKey(String key) {
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64Util.base64Dec(key));
return (PrivateKey) keyFactory.generatePrivate(keySpec);
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
// RSA 私钥加密 返回值base64
public static String RSAEnc(String key, String msg) {
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, getPriKey(key));
byte[] r = cipher.doFinal(msg.getBytes(ENCODING));
return Base64Util.base64Enc(r);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// RSA解密
public static String RSADec(String key, String msg) {
// 转换秘钥
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, getPubKey(key));
byte[] r = cipher.doFinal(Base64Util.base64Dec(msg));
return new String(r,ENCODING);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;

测试!!!!

几种加密方式都可以使用

看具体公司需求而定。

!!!!!!!!!!!!!!!  小风Q769104932 转发请留言 坚持每天学习 加油!!!!

}

Java 加解密算法的更多相关文章

  1. java加解密算法

    什么是加密算法?百度百科给出的解释如下: 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容, ...

  2. java加解密算法--DES

    ECB import sun.misc.BASE64Decoder; import javax.crypto.*; import javax.crypto.spec.DESKeySpec; impor ...

  3. java加解密算法--对称加密工作模式

    对称加密又分为分组加密和序列密码.分组密码,也叫块加密(block cyphers),一次加密明文中的一个块.是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运 ...

  4. JAVA加解密 -- 数字签名算法

    数字签名 – 带有密钥的消息摘要算法 作用:验证数据完整性.认证数据来源.抗否认(OSI参考模型) 私钥签名,公钥验证 RSA 包含非对称算法和数字签名算法 实现代码: //1.初始化密钥 KeyPa ...

  5. 160829、Java加解密与数字签名

    ** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...

  6. Java加解密与数字签名

    ** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...

  7. 11.Java 加解密技术系列之 总结

    Java 加解密技术系列之 总结 序 背景 分类 常用算法 原理 关于代码 结束语 序 上一篇文章中简单的介绍了第二种非对称加密算法 — — DH,这种算法也经常被叫做密钥交换协议,它主要是针对密钥的 ...

  8. 10.Java 加解密技术系列之 DH

    Java 加解密技术系列之 DH 序 概念 原理 代码实现 结果 结束语 序 上一篇文章中简单的介绍了一种非对称加密算法 — — RSA,今天这篇文章,继续介绍另一种非对称加密算法 — — DH.当然 ...

  9. 9.Java 加解密技术系列之 RSA

    Java 加解密技术系列之 RSA 序 概念 工作流程 RSA 代码实现 加解密结果 结束语 序 距 离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项 ...

随机推荐

  1. 怎么让桌面存到d盘

    1.找到桌面文件夹. (C:\Users\Administrator) [C盘],[用户].[“”系统账号“(如Administrator)文件夹],[桌面] 2.打开桌面文件夹的属性. 查看位置,修 ...

  2. Python_OpenCV视频截取并保存

    在图像处理之前,我们需要对拿到手的数据进行筛选,对于视频,我们需要从中截取我们需要的一段或几段 整体思路比较简单,通过设定截取视频的起止时间(帧数),可以将该时间段内的图像保存为新的视频 直接上代码: ...

  3. SAS学习笔记43 宏语句

    流程控制 %GOTO语句与%label语句是结合起来使用的.首先通过%label语句定义一个位置,使用%GOTO语句可直接将程序的执行位置跳到该label标记位置,达到控制程序执行顺序的目的.可实现与 ...

  4. asp.net mvc抓取微信文章里面所有的图片

    /// <summary> /// 下载指定URL下的所有图片 /// </summary> public class WebPageImage { /// <summa ...

  5. Swagger 实践 <一>

    参考 :https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-nswag?view=aspnetcor ...

  6. [JZOJ5279]香港记者题解--最短路图

    [JZOJ5279]香港记者题解--最短路图 题目链接 过 于 暴 力 分析 有一个naiive的想法就是从1到n跑最短路,中途建图,然后在图上按字典序最小走一遍,然而·这是不行的,你这样跳不一定能跳 ...

  7. 3、java基础:抽象类与接口的区别

    抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...

  8. LINUX档案权限

    一.ls命令显示目录详细信息 列表显示目录内容 : ls drwxr-xr-x.  4 root   root       4096 Jun 26 02:07 acpi -rw-r--r--.  1 ...

  9. 二〇一八-美团工程师面试解析(Java)

    一轮面试: 小数是怎么存的 算法题:N二进制有多少个1 Linux命令(不熟悉 JVM垃圾回收算法 C或者伪代码实现复制算法 volatile 树的先序中序后序以及应用场景 Mysql存储记录的数据结 ...

  10. sklearn特征工程

    目录 一.    特征工程是什么?    2 ①特征使用方案    3 ②特征获取方案    4 ③特征处理    4 1.    特征清洗    4 2.    数据预处理    4 3.    特 ...