RSA

package com.demo;

import org.springframework.util.StringUtils;

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64; /**
* RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一。RSA 是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已被 ISO 推荐为公钥数据加密标准。
*/
public class RSAUtils { /**
* 加密(对外暴露)
* 如果使用 公钥 对数据 进行加密,只有用对应的 私钥 才能 进行解密。
* 如果使用 私钥 对数据 进行加密,只有用对应的 公钥 才能 进行解密。
*
* @param keyStr
* @param data
* @return
* @throws Exception
*/
public static String encryptData(String keyStr, String data, Boolean isPublicKey) throws Exception {
if (StringUtils.isEmpty(keyStr)) {
return "";
}
return encryptBASE64(encrypt(getKey(keyStr, isPublicKey), data.getBytes()));
} /**
* 解密(对外暴露)
* 如果使用 公钥 对数据 进行加密,只有用对应的 私钥 才能 进行解密。
* 如果使用 私钥 对数据 进行加密,只有用对应的 公钥 才能 进行解密。
*
* @param keyStr
* @param data
* @return
* @throws Exception
*/
public static String decryptData(String keyStr, String data, Boolean isPublicKey) throws Exception {
if (StringUtils.isEmpty(keyStr)) {
return "";
}
return new String(decrypt(getKey(keyStr, isPublicKey), decryptBASE64(data)), "UTF-8");
} /**
* 加密
*
* @param key
* @param srcBytes
* @return
*/
private static byte[] encrypt(Key key, byte[] srcBytes) {
if (key != null) {
try {
//Cipher负责完成加密或解密工作,基于RSA
Cipher cipher = Cipher.getInstance("RSA");
//对Cipher对象进行初始化
cipher.init(Cipher.ENCRYPT_MODE, key);
//加密,并返回
return cipher.doFinal(srcBytes);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
} /**
* 解密
*
* @param key
* @param encBytes
* @return
*/
private static byte[] decrypt(Key key, byte[] encBytes) {
if (key != null) {
try {
Cipher cipher = Cipher.getInstance("RSA");
//对Cipher对象进行初始化
cipher.init(Cipher.DECRYPT_MODE, key);
//解密并返回结果
return cipher.doFinal(encBytes);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
} /**
* 根据key获取公有或者私有key对象
*
* @param keyStr
* @param isPublicKey
* @return
* @throws Exception
*/
private static Key getKey(String keyStr, Boolean isPublicKey) throws Exception {
if (isPublicKey) {
return getPublicKey(keyStr);
} else {
return getPrivateKey(keyStr);
}
} /**
* 根据公有key获取公有key对象
*
* @param key
* @return
* @throws Exception
*/
private static RSAPublicKey getPublicKey(String key) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return (RSAPublicKey) keyFactory.generatePublic(keySpec);
} /**
* 根据私有key获取私有对象
*
* @param key
* @return
* @throws Exception
*/
private static RSAPrivateKey getPrivateKey(String key) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
} /**
* 获取公有/私有Key
*
* @return
*/
private static KeyPair getRSAKey() {
KeyPair keyPair = null;
try {
//生成公钥和私钥对,基于RSA算法生成对象
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
//初始化密钥对生成器,密钥大小为1024位
keyPairGen.initialize(1024);
//生成一个密钥对,保存在keyPair中
keyPair = keyPairGen.generateKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return keyPair;
} /**
* 对字符串进行BASE64Decoder
*
* @param key
* @return
* @throws Exception
*/
private static byte[] decryptBASE64(String key) {
return Base64.getDecoder().decode(key);
} /**
* 对字节数组进行BASE64Encoder
*
* @param key
* @return
* @throws Exception
*/
private static String encryptBASE64(byte[] key) {
return Base64.getEncoder().encodeToString(key);
} public static void main(String[] args) {
// 生成的一对key保存好
try {
//得到私钥和公钥
KeyPair keyPair = getRSAKey();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); String pubKey = encryptBASE64(publicKey.getEncoded());
String priKey = encryptBASE64(privateKey.getEncoded());
System.out.println("公钥:" + pubKey);
System.out.println("私钥:" + priKey); // 测试
String message = "QWERDF"; System.out.println("明文:" + message);
String jiami = encryptData(pubKey, message, true);
System.out.println("公钥加密后:" + jiami);
String jiemi = decryptData(priKey, jiami, false);
System.out.println("用私钥解密后的结果是:" + jiemi); jiami = encryptData(priKey, message, false);
System.out.println("私钥加密后:" + jiami);
jiemi = decryptData(pubKey, jiami, true);
System.out.println("用公钥解密后的结果是:" + jiemi);
} catch (Exception e) {
e.printStackTrace();
}
} }

输出:

公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRl5SHQ7b6oyqAhViqiEe1ioC/xj3Wbolopv0mXyWkV8q/SMnbvl0PCeNhoMqHEr7ch2UlLL9130vqrOqrTMEDOX+7VzNEO2EVrcQIbZv69Tz6nIaH5IHuSo2zlySDtEV8q1/PwlvbSLZDsAKGmMj4jPaJPTKaseqN9CVTkV5gfQIDAQAB
私钥:MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJGXlIdDtvqjKoCFWKqIR7WKgL/GPdZuiWim/SZfJaRXyr9Iydu+XQ8J42GgyocSvtyHZSUsv3XfS+qs6qtMwQM5f7tXM0Q7YRWtxAhtm/r1PPqchofkge5KjbOXJIO0RXyrX8/CW9tItkOwAoaYyPiM9ok9Mpqx6o30JVORXmB9AgMBAAECgYAIWKU2H+akdaghGAPeOtPJj3gUBlxTJ6EO88u9YGT7B+Fil9yikUYqb4mudhZGKgfxAn4E5IzRSAzFFkaZrVu/KkQEl0+V6QUSV+VlNk59Fm+71Vvyc91U1P5pHu8B22ZNx6n+QUw1oNlYRMTpB9rPDROpQ2McP85qLSdjc6oELQJBANr/geEHNvropBDSgoAun24CxrN5wPbz55aq6WL3HP4Y6ocfHKKantboe7DeQqi4ZJOuPUzV//a3tRaIFjdn5ysCQQCqMPzubRwiFN4GcO/Esz3khcBFdkURI2iY0WgPPK3A3G02Uz05EjDbWoyjr7E/3fTxq57t847hcqB5wFu88AL3AkEAyFeKR4REJdGBleoefIkqTIe5oyK1BrYmnM0J6QFLwqCknKw3lAGDYfMYhLsvnA3j5L43Uf1LxjZVMaGZQWKKNQJAV+rMjmJg+R4sf8lRoxww6d9KLtfk3/CZtO/gQJbI72svI7QmWVgTUw1Yv6of920yfrF4fVWnRsFPMvXyrgySiwJBAIc6ojV4uv92+1vFpirbBLqyBV0YK4hok3EO+Il5iWZK5VJYuRIQsBniT4X+BqA9653CqFoLHt+0LCjmkndm70Q=
明文:QWERDF
公钥加密后:d/CSSxZ76bgIuUjZELpvwCO1Uae4fg5HUHqYAZScvl9sAoDX/k7lg2RMcct5yqNu0PMMMmvG4Km1i86kfzBXVgFiHDhiQV0uIAXawBcC43qoa9nD7Hqgkd3+DVlWz5NGNvI1ROQCsQ+jBYDIHtSOOBKaIxp3/qoifmwlMBBY/Ok=
用私钥解密后的结果是:QWERDF
私钥加密后:hEWfdnBuCg1vIRK7iQUhCe1wDxJfXh67nLlkMD/PpyjAOQQm1JrVXkBVtPcwIWOVVQFCgcZpqg2M51z3LtdcLTAuxHQKY6ypKkOTg6ziK/egx4SHxjvRZRn4kYjuMpQIiUoSdE7xmp3HRrlHmOhDTrTONawKSVOh7vcBGncNr90=
用公钥解密后的结果是:QWERDF

  

AES

package com.demo;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64; /**
* AES 本身就是为了取代 DES 的,AES 具有更好的 安全性、效率 和 灵活性
*/
public class AESUtils { /*
* 加密(对外暴露)
*/
public static String encryptData(String privateKey, String content) throws Exception {
KeyGenerator keygen = getKeyGenerator(privateKey);
SecretKey key = new SecretKeySpec(keygen.generateKey().getEncoded(), "AES");
return Base64.getEncoder().encodeToString(encrypt(key, content.getBytes("UTF-8")));
} /*
* 解密(对外暴露)
*/
public static String decryptData(String privateKey, String content) throws Exception {
KeyGenerator keygen = getKeyGenerator(privateKey);
SecretKey key = new SecretKeySpec(keygen.generateKey().getEncoded(), "AES");
return new String(decrypt(key, Base64.getDecoder().decode(content)), "UTF-8");
} private static KeyGenerator getKeyGenerator(String privateKey) throws NoSuchAlgorithmException {
KeyGenerator keygen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(privateKey.getBytes());
keygen.init(128, secureRandom);
return keygen;
} private static byte[] encrypt(Key key, byte[] srcBytes) {
if (key != null) {
try {
// Cipher负责完成加密或解密工作,基于AES
Cipher cipher = Cipher.getInstance("AES");
// 对Cipher对象进行初始化
cipher.init(Cipher.ENCRYPT_MODE, key);
// 加密,保存并返回
return cipher.doFinal(srcBytes);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
} private static byte[] decrypt(Key key, byte[] encBytes) {
if (key != null) {
try {
Cipher cipher = Cipher.getInstance("AES");
//对Cipher对象进行初始化
cipher.init(Cipher.DECRYPT_MODE, key);
//解密
return cipher.doFinal(encBytes);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
} public static void main(String[] args) throws Exception {
String privateKey = "ABC";
String content = "ASD456";
String m = encryptData(privateKey, content);
System.out.println("根据私钥:" + privateKey + ",加密后的密文是:" + m);
System.out.println("根据私钥:" + privateKey + ",解密后的明文是:" + decryptData(privateKey, m));
} }

输出:

根据私钥:ABC,加密后的密文是:6vLE6e1f//pq9e+ZmczfxQ==
根据私钥:ABC,解密后的明文是:ASD456

  

DES

package com.demo;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;
import java.security.SecureRandom;
import java.util.Base64; public class DESUtils { private static Key key;
private static final String PRIVATE_KEY = "ABC"; static {
try {
KeyGenerator generator = KeyGenerator.getInstance("DES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(PRIVATE_KEY.getBytes());
generator.init(secureRandom);
key = generator.generateKey();
generator = null;
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 加密,返回BASE64的加密字符串
* @param str
* @return
*/
public static String getEncryptString(String str) throws Exception {
byte[] strBytes = str.getBytes("UTF-8");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptStrBytes = cipher.doFinal(strBytes);
return Base64.getEncoder().encodeToString(encryptStrBytes);
} /**
* 对BASE64加密字符串进行解密
* @param str
* @return
*/
public static String getDecryptString(String str) throws Exception {
byte[] strBytes = Base64.getDecoder().decode(str);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] encryptStrBytes = cipher.doFinal(strBytes);
return new String(encryptStrBytes, "UTF-8");
} public static void main(String[] args) throws Exception {
String name = "catdog";
String password = "Cat<%1?2>Dog";
String encryname = getEncryptString(name);
String encrypassword = getEncryptString(password);
System.out.println("加密:" + encryname);
System.out.println("加密:" + encrypassword); System.out.println("解密:" + getDecryptString(encryname));
System.out.println("解密:" + getDecryptString(encrypassword));
}
}

输出:

加密:RnvNku4diHc=
加密:/ru3Rho55Ji9RGcOleTvQA==
解密:catdog
解密:Cat<%1?2>Dog

  

Java实现RSA加密&AES加密&DES加密的更多相关文章

  1. 对称加密----AES和DES加密、解密

    目前主流的加密方式有:(对称加密)AES.DES        (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...

  2. RAS、AES、DES加密

    ---------------------------------------------------------------------------------------------------- ...

  3. 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

    原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...

  4. java使用RSA与AES加密解密

    首先了解下,什么是堆成加密,什么是非对称加密? 对称加密:加密与解密的密钥是相同的,加解密速度很快,比如AES 非对称加密:加密与解密的秘钥是不同的,速度较慢,比如RSA 先看代码(先会用在研究) 相 ...

  5. AES,DES加密JS源文件及其使用方法

    源文件地址:https://github.com/dididi1234/crypto 进入之后直接下载CryptoJS.js,js中直接引用,小程序也一样可以使用 具体使用方法和vue中的Crypto ...

  6. Java http数据MD5、AES、DES加密

    一,数据加密 1.提供了,md5,Hex,Sha等不可逆算法加密 2.AES加密,此加密方式瘦平台影响较重,所以只适合同类平台加密解密 3.DES自定义加密,跨平台,兼容性好 1.org.apache ...

  7. 常用加密解密算法【RSA、AES、DES、MD5】介绍和使用

    内容不转载了,加上链接https://blog.csdn.net/u013565368/article/details/53081195?_t=t

  8. Java使用RSA加密算法对内容进行加密

    什么是RSA加密算法 RSA是一种典型的非对称性加密算法,具体介绍可参考阮一峰的日志 RSA算法原理 下面是使用RSA算法对传输内容进行加密的一个简要Java案例,主要用到了三个类,大体实现如下: 对 ...

  9. DES加密解密与AES加密解密

    随着开发时间的变长,当初认为比较难的东西,现在渐渐也就变的不那么难了!特别对于一些经常很少使用的类,时间长了之后渐渐就陌生了.所以在这里写一些日后可能会用到的加密与解密. 一.AES加密算法和DES加 ...

  10. java des 加密/解密

    JAVA实现 加密 注意:DES加密和解密过程中,密钥长度都必须是8的倍数 public byte[] desCrypto(byte[] datasource, String password) { ...

随机推荐

  1. 异步链式编程—promise沉思录

    一.promise的组成 1.task:promise要完成的任务: 2.result:处理完的数据: 3.status:状态: 4.fulfill.reject(对应catch) 5.Resolve ...

  2. Aizu2249-Road Construction-(Dijkstra)

    https://vjudge.net/problem/Aizu-2249 题意:计划图中有n个城市m条路,首都是1号城市,要选一些路去修,让各个城市到首都的路径最短,在路径最短的情况下修路费用最小. ...

  3. LeetCode 737. Sentence Similarity II

    原题链接在这里:https://leetcode.com/problems/sentence-similarity-ii/ 题目: Given two sentences words1, words2 ...

  4. MongoDB Shell db.runCommand

    db.runCommand()示例 我们使用MongoDB Shell登录到mongos,添加Shard节点 [root@100 shard]# /usr/local/mongoDB/bin/mong ...

  5. vue-cli配置跨域代理

    现在使用vue大多使用了前后端分离模式,因此游览器经常显示跨域失败的信息,现在跨域的方式很多种,主要分两大类,ajax跨域,dom跨域,具体的方法就不例举啦. vue-cli作为一个强大的脚手架,内置 ...

  6. 实践分布式配置中心Apollo

    简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景 ...

  7. (转) 中断处理程序&中断服务例程

             关于中断处理程序和中断服务例程ISR的区别及联系,之前一直搞混,今天抽时间将两者关系弄弄清楚.ok,下面进入主题.       首先中断处理程序(Interrupt Handler) ...

  8. PowerDesigner应用02 逆向工程之导出PDM文件前过滤元数据(表、视图、存储过程等)

    在上一篇文章<PowerDesigner应用01 逆向工程之配置数据源并导出PDM文件>步骤二中导出了目标数据库对应的PDM文件, 该文件中展示出了所有表的信息与关系. 某些业务场景下只需 ...

  9. CloudFlare上线了新的Proxy Anything选项, 支持转发TCP连接

    https://www.nicho1as.wang/articles/cf-proxy-anything.html 申请地址:https://goo.gl/forms/Oc2jyyo0kXsrMyw3 ...

  10. Matlab Script to pre-process UAV123 tracking dataset

    Matlab Script to pre-process UAV123 tracking dataset 2019-11-08 09:43:11 Official project page: http ...