文章目录

  • 说明
  • RSA加解密
  • 测试代码
  • 打印输出

说明

1:下面代码参考自《JAVA加密解密的艺术》,有部分修改,详见原理见原书
2:下面代码是RSA在JAVA中API级别的代码实现,具体实现原理见前面章节
3:下面代码中只需要JDK即可,其中为了便于阅读使用了commons-codec中Base64编码
4:公钥密码既可以公钥加密私钥解密,又可以私钥加密公钥解密,但注意加密解密必须是同一个密钥对

RSA加解密

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.HashMap;
import java.util.Map;/*** @Description: RSA加解密操作(公钥加密私钥解密-私钥加密公钥解密)* @Author: ZhangYu* @Date: 2020/11/18*/
public class RSACoder {//公钥密码密钥算法public static final String KEY_ALGORITHM = "RSA";//公钥private static final String PUBLIC_KEY = "RSAPublicKey";//私钥private static final String PRIVATE_KEY = "RSAPrivateKey";/*** RSA密钥长度* 默认1024位* 密钥长度必须是64的倍数* 范围在512-65536位之间*/private static final int KEY_SIZE = 512;/*** @Description: 私钥解密* @Param: data 待解密数据* @Param: key 私钥* @return: byte[] 解密数据* @Author: ZhangYu* @Date: 2020/11/18*/public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {//获取私钥PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成私钥PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);//对数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** @Description: 公钥解密* @Param: data 待解密数据* @Param: key 公钥* @return: byte[] 解密数据* @Author: ZhangYu* @Date: 2020/11/18*/public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {// 取得公钥X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成公钥PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);// 对数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** @Description: 公钥加密* @Param: data 待加密数据* @Param: key 公钥* @return: byte[] 加密数据* @Author: ZhangYu* @Date: 2020/11/18*/public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {//取得公钥X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);//对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** @Description: 私钥加密* @Param: data 待加密数据* @Param: key 私钥* @return: byte[] 加密数据* @Author: ZhangYu* @Date: 2020/11/18*/public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {//取得私钥PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);//生成私钥PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);//对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** @Description: 获取私钥* @Param: keyNap 秘钥对* @return: byte[] 私钥* @Author: ZhangYu* @Date: 2020/11/18* @Throws:*/public static byte[] getPrivateKey(Map<String, Object> keyNap) throws Exception {Key key = (Key) keyNap.get(PRIVATE_KEY);return key.getEncoded();}/*** @Description: 获取公钥* @Param: keyMap  秘钥对* @return: byte[] 公钥* @Author: ZhangYu* @Date: 2020/11/18* @Throws:*/public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return key.getEncoded();}/*** @Description: 初始化秘钥* @return: Map  秘钥对* @Author: ZhangYu* @Date: 2020/11/18*/public static Map<String, Object> initKey() throws Exception {//实例化密钥对生成器KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);//初始化密钥对生成器keyPairGen.initialize(KEY_SIZE);//生成密钥对KeyPair keyPair = keyPairGen.generateKeyPair();//公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//封装密钥Map<String, Object> keyMap = new HashMap<>(2);keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}
}

测试代码

import org.apache.commons.codec.binary.Base64;
import org.junit.BeforeClass;
import org.junit.Test;import java.nio.charset.Charset;
import java.util.Map;/*** @Description: RSA密码算法测试* @Author: ZhangYu* @Date: 2020/11/18*/
public class RSACoderTest {//公钥private static byte[] publicKey;//私钥private static byte[] privateKey;@BeforeClasspublic static void setUp() throws Exception {//初始化密钥Map<String, Object> keyPair = RSACoder.initKey();//获取公钥publicKey = RSACoder.getPublicKey(keyPair);//获取私钥privateKey = RSACoder.getPrivateKey(keyPair);//打印输出私钥和公钥编码字符串System.out.println("公钥:\n" + Base64.encodeBase64String(publicKey));System.out.println("私钥:\n" + Base64.encodeBase64String(privateKey));}/*** @Description: 私钥加密-公钥解密* @return: void* @Author: ZhangYu* @Date: 2020/11/18*/@Testpublic void test1() throws Exception {System.out.println("\n私钥加密-公钥解密");//明文String input = "Hello 密码-私钥加密-公钥解密";byte[] data = input.getBytes();//私钥加密byte[] ciphertext = RSACoder.encryptByPrivateKey(data, privateKey);System.out.println("加密后密文\n" + Base64.encodeBase64String(ciphertext));//公钥解密byte[] plaintext = RSACoder.decryptByPublicKey(ciphertext, publicKey);System.out.println("解密后明文\n" + new String(plaintext, Charset.defaultCharset()));}/*** @Description: 公钥加密-私钥解密* @return: void* @Author: ZhangYu* @Date: 2020/11/18*/@Testpublic void test2() throws Exception {System.out.println("\n公钥加密-私钥解密");//明文String input = "Hello 密码-公钥加密-私钥解密";byte[] data = input.getBytes();//公钥加密byte[] ciphertext = RSACoder.encryptByPublicKey(data, publicKey);System.out.println("加密后密文\n" + Base64.encodeBase64String(ciphertext));//私钥解密byte[] plaintext = RSACoder.decryptByPrivateKey(ciphertext, privateKey);System.out.println("解密后明文\n" + new String(plaintext, Charset.defaultCharset()));}}

打印输出

非对称加密——RSA算法JAVA代码实践相关推荐

  1. c语言字符串非对称加密,RSA算法C语言实现(支持任意位密钥)

    之前分享过三种常用MD5.SHA2和AES加密算法(点这里)实现源码,前三者分别属于哈希加密和对称加密,而另一种很常用的非对称加密RSA算法实现这次分享出来.RSA算法的原理和用途大家可以网上自行搜索 ...

  2. 【工具编写】python实现非对称加密RSA算法

    python实现非对称加密RSA算法 0x01 RSA算法介绍 RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rives ...

  3. php封装一个加密算法,PHP封装的非对称加密RSA算法示例

    本文实例讲述了PHP封装的非对称加密RSA算法.分享给大家供大家参考,具体如下: 将php的openssl扩展中的非对称加密函数封装成一个Rsa类. 需要注意的是,在windows上,需要打开open ...

  4. 非对称加密RSA算法原理及实际应用场景

    非对称加密RSA算法原理及实际应用场景 引言 应用场景 RSA 算法原理 数学基础 质数 欧拉定理 模指数运算 小白理解 为什么需要足够大的质数 引言 我数学差的离谱,所以我朋友去学AI,我还在这搞这 ...

  5. 加密基础知识二 非对称加密RSA算法和对称加密

    一.RSA的计算过程 上述过程中,出现了公钥(3233,17)和私钥(3233,2753),这两组数字是怎么找出来的呢?参考RSA算法原理(二) 首字母缩写说明:E是加密(Encryption)D是解 ...

  6. Java代码实现非对称加密RSA算法示例

    非对称加密:有两把密钥:使用公钥加密,必须使用私钥解密:或者使用私钥加密,必须使用公钥解密 加解密核心类:Cipher 下面代码是使用RSA算法加解密的一个示例,实现过程包括:生成密钥对,把公钥和私钥 ...

  7. 密码学03--go语言与非对称加密RSA算法的实现

    目录 1.对称加密的弊端 2.非对称加密 2.1 非对称加密使用场景 2.2 区分公私钥 2.3 非对称加密通信流程 2.4 非对称加密与对称加密 3.非对称加密RSA算法 3.1 RSA算法 3.2 ...

  8. Java(110):非对称加密RSA的使用(KeyPair生成密钥)

    Java(110):非对称加密RSA的使用(KeyPair生成密钥) RSA 算法是一种非对称加解密算法.服务方生成一对 RSA 密钥,即公钥 + 私钥,将公钥提供给调用方,调用方使用公钥对数据进行加 ...

  9. Java(111):非对称加密RSA的使用(openssl生成RSA公私钥对)

    Java(111):非对称加密RSA的使用(openssl生成RSA公私钥对) 1.openssl生成RSA公私钥对 [root@loaclhost ~]# openssl version OpenS ...

最新文章

  1. Python 爬虫框架Scrapy安装汇总
  2. 试编写一个汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数
  3. quick check
  4. c 多线程mysql_多线程读写mysql数据库
  5. Intel Realsense D435 Post-processing filters 后处理过滤器(用于消除图像的黑洞)
  6. Java的深浅拷贝你了解吗?
  7. 从 TFS 迁移源代码到 git
  8. Makingware调用静态块,实现自定义html内容的常用方法(不需要修改模版部分)...
  9. Nginx软件优化【转】
  10. 视频抽帧并存图 python_使用Python实现跳帧截取视频帧
  11. android用户界面是通过组件,[科技]Android 用户界面---定制组件(Custom Components)(一)...
  12. 语言余一个负数_Python 中负数取余问题
  13. Atitit 格式转换的艺术 以excel转换txt为例
  14. 领域的初学者--推荐的一本书
  15. 软件测试中的测试报告
  16. Excel比较两列的值
  17. 选中的磁盘具有MBR分区表,在EFI系统上,windows只能安装到GPT磁盘
  18. 2022-2028年中国位置大数据行业市场专项调查及投资前景分析报告
  19. Python+appium app自动化
  20. 怎么美化Typora的标题格式

热门文章

  1. C语言修饰词之violate
  2. plsql官方下载地址
  3. gaussDB 安装使用
  4. SNP/单核苷酸多态性分析
  5. 第三届“SLAM技术及应用”暑期学校日程安排
  6. 数值计算之 插值法(1)多项式插值——拉格朗日插值法
  7. 什么是SWFObject,如何使用!
  8. 求职之C++小知识点整理
  9. GPS从入门到放弃(八) --- GPS卫星速度解算
  10. 轩小陌的Python笔记:day01 计算机基础和环境搭建