Java 加解密算法
目前加密算法中分两种
一种是对称加密,一种是非对称加密
那么什么是对称加密呢?对称加密可以理解为加密和解密用的是一个钥匙。
而非对称加密,加锁用的是一个钥匙,而解锁用的是另外一个钥匙。
目前市面上用的比较多的对称加密,比如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 加解密算法的更多相关文章
- java加解密算法
什么是加密算法?百度百科给出的解释如下: 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容, ...
- java加解密算法--DES
ECB import sun.misc.BASE64Decoder; import javax.crypto.*; import javax.crypto.spec.DESKeySpec; impor ...
- java加解密算法--对称加密工作模式
对称加密又分为分组加密和序列密码.分组密码,也叫块加密(block cyphers),一次加密明文中的一个块.是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运 ...
- JAVA加解密 -- 数字签名算法
数字签名 – 带有密钥的消息摘要算法 作用:验证数据完整性.认证数据来源.抗否认(OSI参考模型) 私钥签名,公钥验证 RSA 包含非对称算法和数字签名算法 实现代码: //1.初始化密钥 KeyPa ...
- 160829、Java加解密与数字签名
** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...
- Java加解密与数字签名
** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...
- 11.Java 加解密技术系列之 总结
Java 加解密技术系列之 总结 序 背景 分类 常用算法 原理 关于代码 结束语 序 上一篇文章中简单的介绍了第二种非对称加密算法 — — DH,这种算法也经常被叫做密钥交换协议,它主要是针对密钥的 ...
- 10.Java 加解密技术系列之 DH
Java 加解密技术系列之 DH 序 概念 原理 代码实现 结果 结束语 序 上一篇文章中简单的介绍了一种非对称加密算法 — — RSA,今天这篇文章,继续介绍另一种非对称加密算法 — — DH.当然 ...
- 9.Java 加解密技术系列之 RSA
Java 加解密技术系列之 RSA 序 概念 工作流程 RSA 代码实现 加解密结果 结束语 序 距 离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项 ...
随机推荐
- php实现微信小程序登录
以上是官方的流程介绍,已经说的很详细了,现在简单介绍一下流程 前端通过wx.login生成code传递给后端,后端通过提交Appid + appSecret + code 到微信方服务器 获取 ses ...
- jenkinsFile harbor docker优化版
node { //study-center def mvnHome = tool name: 'maven', type: 'maven' REGISTRY = "192.168.22.27 ...
- IOS+H5页面自定义按钮无效
在IOS整合H5页面的时候,自定义的按钮失去效果,Android系统可以. 如图,确定和取消按钮在IOS系统无效. 解决办法是在两个按钮上加上一个style属性即可 <span class=&q ...
- (七)lucene之中文检索和高亮显示以及摘要
前提:本章节使用lucene5.3.0版本,luke也是此版本的. 1.1 生成索引 package com.shyroke.lucene; import java.io.IOException; ...
- JAVA的转义字符
一.常见的转义字符 转移字符对应的英文是escape character , 转义字符串(Escape Sequence) 字母前面加上捺斜线"\"来表示常见的那些不能显示的AS ...
- sql过程的条件是IN,用脚本执行
DECLARE @sql nvarchar(); DECLARE @inStr nvarchar(); SET @inStr='''条件1'',''条件2'''; set @sql='SELECT * ...
- Windows 下 mysql 5.7 设置 区分大小写(敏感),设置默认编码 utf8mb4
修改编码 c盘下搜索 C:\ProgramData\MySQL\MySQL Server 5.7 在该my.ini文件下进行配置修改 [client] default-character-set = ...
- Ubuntu 14.04 用户如何安装深度音乐播放器和百度音乐插件
播放本地音乐或者收听国外的音乐电台,Ubuntu 14.04 自带的音乐播放器 Rhythmbox 完全能够满足,但是如果你想有像酷狗那样的国内播放器就需要折腾一下,还好有深度音乐播放器,这是一款完全 ...
- Asp.Net Core 轻松学系列-1阅读指引目录
https://www.cnblogs.com/viter/p/10474091.html 目录 前言 1. 从安装到配置 2. 业务实现 3. 日志 4. 测试 5. 缓存使用 6.网络和通讯 7. ...
- jQuery_jQuery的基本使用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...