RSA是当前最流行的非对称加密方式,使用公钥加密使用密钥解密,如何妥善的保管密钥就成了关键。

动态生成密钥

工具类

package com.yitong.utils;

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.NoSuchAlgorithmException;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

/**

* RSA工具类

*/

public class RSAUtil {

/**

* @description: 随机生成RSA密钥对(密钥默认长度为1024)

* @params:

* @return:

*/

public static KeyPair getRSAKeyPair() {

try {

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");

kpg.initialize(1024);

return kpg.genKeyPair();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

return null;

}

/**

* @description: 随机生成RSA密钥对

* @params:

* @return:

*/

public static KeyPair getRSAKeyPair(int length) {

try {

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");

kpg.initialize(length);

return kpg.genKeyPair();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

return null;

}

/**

* @description: 用公钥加密

* @params:

* @return: String

*/

public static String encryptData(String data, PublicKey publicKey) {

try {

Cipher cipher = Cipher.getInstance("RSA");

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

return HexUtil.encode(cipher.doFinal(data.getBytes()));

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

* @description: 用私钥解密

* @params:

* @return: String

*/

public static String decryptData(String encryptedData, PrivateKey privateKey) {

try {

Cipher cipher = Cipher.getInstance("RSA");

cipher.init(Cipher.DECRYPT_MODE, privateKey);

return new String(cipher.doFinal(HexUtil.decode(encryptedData)));

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

* @description: 字符串还原公钥

* @params:

* @return: PublicKey

*/

public static PublicKey getPublicKey(String key) {

try {

byte[] keyBytes;

keyBytes = Base64Util.decode(key);

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);

KeyFactory keyFactory = null;

keyFactory = KeyFactory.getInstance("RSA");

PublicKey publicKey = keyFactory.generatePublic(keySpec);

return publicKey;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

* @description: 字符串还原公钥Base64

* @params:

* @return: String

*/

public static String getPublicKey(PublicKey publicKey) {

return Base64Util.encode(publicKey.getEncoded());

}

/**

* @description: 字符串还原私钥

* @params:

* @return: PrivateKey

*/

public static PrivateKey getPrivateKey(String key) {

try {

byte[] keyBytes;

keyBytes = Base64Util.decode(key);

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);

KeyFactory keyFactory = null;

keyFactory = KeyFactory.getInstance("RSA");

PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

return privateKey;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

* @description: 字符串还原私钥Base64

* @params:

* @return: String

*/

public static String getPrivateKey(PrivateKey privateKey) {

return Base64Util.encode(privateKey.getEncoded());

}

}

使用

static String plainText = "123456789123456789";// 明文

static String cipherText;// 密文

static PublicKey publicKey;

static PrivateKey privateKey;

private static void RSAEncrypt() {

if (null == publicKey) {

KeyPair aKey = RSAUtil.getRSAKeyPair();

publicKey = aKey.getPublic();

privateKey = aKey.getPrivate();

String pString = RSAUtil.getPublicKey(publicKey);

String pString2 = RSAUtil.getPrivateKey(privateKey);

System.out.println("公钥:" + pString + "\n私钥:" + pString2);

}

for (int i = 0; i < 5; i++) {

cipherText = RSAUtil.encryptData(plainText, publicKey);

System.out.println("加密密文:" + cipherText);

try {

System.out.println("解密明文:" + RSAUtil.decryptData(cipherText, privateKey));

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

这个是动态生成一对密钥的用法,这里存在一个问题,自己生成的一对密钥别人不知道,除了自己任何人都没有办法解密,我们一般都是自己加密给别人解密,这样就得想办法把私钥传给别人,但存在泄露的风险。

利用证书和keystore方式加解密

这种方式是为了解决传递密钥存在泄露风险的问题,keystore拥有完整的一对密钥,既包含公钥也包含私钥,证书只包含公钥,只能利用证书进行加密。

利用keytool生成证书

以win系统为例,打开cmd,输入:

keytool -genkey -alias 你的证书别名 -keyalg 密钥算法 -keystore 证书库文件保存的位置和文件名 -keysize 密钥长度 -validity 证书有效期天数

示例:

keytool -genkey -alias mykey -keyalg RSA -keystore D:/mk.keystore -keysize 1024 -validity 36500

然后按照提示输入密钥库的相关信息:

输入密钥库口令:

再次输入新口令:

您的名字与姓氏是什么?

[Unknown]: zhang

您的组织单位名称是什么?

[Unknown]: pc

您的组织名称是什么?

[Unknown]: pc

您所在的城市或区域名称是什么?

[Unknown]: shanghai

您所在的省/市/自治区名称是什么?

[Unknown]: shanghai

该单位的双字母国家/地区代码是什么?

[Unknown]: 86

CN=zhang, OU=yitong, O=pc, L=shanghai, ST=shanghai, C=86是否正确?

[否]: 是

输入 的密钥口令

(如果和密钥库口令相同, 按回车):

再次输入新口令:

Warning:

JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore D:/mk.keystore -destkeystore D:/mk.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

这样就在D盘根目录下生成一个密钥库,这个密钥库相当重要一定要妥善保管,接下来就需要生成证书了:

keytool -export -alias mykey -keystore D:/mk.keystore -file D:/mk.cer

这样就能再D盘根目录下看到证书文件了,我们可以根据需要在原有的密钥库添加新的密钥。

加解密

直接上代码:

static String plainText = "123456789123456789";// 明文

static String cipherText;// 密文

static PublicKey publicKey;

static PrivateKey privateKey;

static String certificatePath = "D:/mk.cer";

static String keystorePath = "D:/mk.keystore";

private static void CerEncrypt() throws Exception {

// 加密

CertificateFactory cff = CertificateFactory.getInstance("X.509");

InputStream in = new FileInputStream(certificatePath);

Certificate cf = cff.generateCertificate(in);

PublicKey pString = cf.getPublicKey(); // 得到证书文件携带的公钥

System.out.println("公钥:" + Base64Util.encode(pString.getEncoded()));

cipherText = RSAUtil.encryptData(plainText, pString);

System.out.println("加密密文:" + cipherText);

// 解密

FileInputStream inputStream = new FileInputStream(keystorePath);

KeyStore ks = KeyStore.getInstance("JKS");

ks.load(inputStream, "000000".toCharArray());

inputStream.close();

String alias = "mykey";

String pswd = "000000";

Certificate cert = ks.getCertificate(alias);

PublicKey publicKey = cert.getPublicKey();

PrivateKey privateKey = (PrivateKey) ks.getKey(alias, pswd.toCharArray());

System.out.println("私钥:" + RSAUtil.getPrivateKey(privateKey) + "\n公钥:" + RSAUtil.getPublicKey(publicKey));

System.out.println(RSAUtil.decryptData(cipherText, privateKey));

}

应用

当我们的报文需要RSA加密的时候就可以将证书放在客户端,keystore放在服务端,这样客户端发送的报文就能自行加密,在服务端利用keystone文件获取私钥进行解密。

java发送加密报文_RSA加密---从后台到客户端实现报文加解密相关推荐

  1. php椭圆曲加密,兄弟连区块链教程区块链信息安全3椭圆曲线加解密及签名算法的技术原理一...

    区块链教程区块链信息安全3椭圆曲线加解密及签名算法的技术原理一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退,让 ...

  2. python编写加密程序_python编写的维吉尼亚密码加解密程序

    维吉尼亚密码表 ============================================= #维吉尼亚密码 加密 key='helloworld' plaintext='whereis ...

  3. 数据加解密之Java实现Base64加密

    https://blog.csdn.net/slvayf/article/details/83377834 本文知识点引自上方链接 //-------------------------------- ...

  4. Base64 混淆加密+迭代次数,Base64前后端加解密不一致、Base64 js加解密结果与java加解密结果不一致,Base64中文加密乱码

    Table of Contents 概述 一.js加密,java解密 1.js加密 1.中文字符串加密 2.英文等字符串加密 3.中文字符串混淆.迭代加密 4.英文等字符串混淆.迭代加密 5.JSON ...

  5. 数据加解密基础知识介绍,及Java实现Base64加密(详细)

    加密流程涉及的一些关键词: 明文:准备加密的信息 加密:把明文处理为密文的过程 加密算法:具体实现明文转为密文的算法 加密密钥:通过加密算法进行加密操作需要的密钥 密文:被加密的明文 解密:将密文转为 ...

  6. SSH HTTPS 公钥、秘钥、对称加密、非对称加密、 总结理解

    2019独角兽企业重金招聘Python工程师标准>>> 作者:shede333 主页:http://my.oschina.net/shede333 && http:/ ...

  7. 【加解密篇】Passware Encryption Analyzer快速检测加密文件软件

    [加解密篇]Passware Encryption Analyzer快速检测加密文件软件 ​ 密码加密分析仪是一种免费工具,可扫描系统以检测受保护或加密的文件.存档和其他加密类型的文件-[suy] 文 ...

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

    序 距离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项目太紧,具体的就不多说了,想听我吐槽的小伙伴,可以私信给我(*^__^*) .上一篇文章,已经把 ...

  9. java rsa加密 加签_RSA加密解密与加签验签

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...

最新文章

  1. Windows XP硬盘安装Ubuntu 11.10双系统全程图解
  2. 第14件事 分析竞争对手的方法
  3. php 两个二维数组怎么去重,php 二维数组怎么不去重合并
  4. 用数学方法分析哪类游戏中的AI难度最大
  5. start() 跟 run() 方法的区别和联系
  6. mybatis学习(19):模糊查询#
  7. 《程序员面试金典》解题目录(更新完毕)
  8. IDL读取TXT文件并写入二维数组中【转】
  9. 数据分析师能用到mysql_浅谈数据分析师的必备技能SQL
  10. 一个Bug你改了两天,真有这么难吗?
  11. swift使用cocoapods导入第三方库
  12. 监控指标分类汇总归纳
  13. 微软笔试题《Arithmetic Puzzles》- 题解
  14. 小米8刷原生安卓系统
  15. Android中通过USB连接来控制硬件设备
  16. win2003 iis 设置301转向
  17. 各大平台热搜排行榜原型
  18. Shell Tools and Scripting
  19. Android RemoteViews 解析
  20. 柔性AMOLED基板PI浆料行业现状调研及趋势分析报告

热门文章

  1. 收藏清单: python测试框架最全资源汇总
  2. Select控件可选可输入
  3. Java环境变量之Path和classpath
  4. 三星笔试能带计算机吗,2021年三星笔试试题+经验谈
  5. hive hql文档_30分钟入门 Hive SQL(HQL 入门篇)
  6. 关于Java你不知道的那些事之Java注解和反射
  7. 用华为鸿蒙 OS 2.0 系统写出了HelloWorld!那些说鸿蒙是PPT的可以闭嘴了!
  8. 都说了多少遍,不要再学 JSP 了!
  9. 我的程序员生活的前六年,是这样度过的!
  10. 十分钟了解 git 那些 “不常用” 命令