非对称加密:有两把密钥;使用公钥加密,必须使用私钥解密;或者使用私钥加密,必须使用公钥解密

加解密核心类:Cipher

下面代码是使用RSA算法加解密的一个示例,实现过程包括:生成密钥对,把公钥和私钥保存到文件中,读取公钥和私钥,对明文进行加密和解密。代码中都有详细的注释,如果代码中有哪些地方没看明白的,可以直接评论

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.security.Key;
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;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;public class AsymmetricEncryption {public static void main(String[] args) throws Exception{String input="巅峰小苏";//需要加密的数据String algorithm="RSA";//加密算法//生成密钥对并保存在本地文件中generateKeyToFile(algorithm,"a.pub","a.pri");//读取私钥PrivateKey privateKey = getPrivateKey("a.pri", algorithm);//读取公钥PublicKey publicKey = getPublicKey("a.pub", algorithm);//加密String en=encryptRSA(algorithm, privateKey, input);System.out.println("加密:"+en);//解密String de=decryptRSA(algorithm, publicKey, en);System.out.println("解密:"+de);}/*** 私钥加密* @param algorithm 算法* @param privateKey 私钥* @param input  原文* @return* @throws Exception*/public static String encryptRSA(String algorithm,Key privateKey,String input)throws Exception{//创建加密对象Cipher cipher=Cipher.getInstance(algorithm);//对加密进行初始化,第一个参数是:加密的模式//第二个参数是:你想使用公钥加密还是私钥加密,这里使用的是私钥加密cipher.init(Cipher.ENCRYPT_MODE, privateKey);byte[] bytes=cipher.doFinal(input.getBytes());return Base64.encodeBase64String(bytes);}/*** 公钥解密* @param algorithm 算法* @param publickey 公钥* @param encrypted 密文* @return* @throws Exception*/public static String decryptRSA(String algorithm,Key publickey,String encrypted)throws Exception{Cipher cipher=Cipher.getInstance(algorithm);//注意:如果使用公钥加密就必须使用私钥解密,使用私钥加密就必须使用公钥解密,否则会出现异常cipher.init(Cipher.DECRYPT_MODE, publickey);//把base64密文转回字节数组byte[] decode=Base64.decodeBase64(encrypted);byte[] bytes1=cipher.doFinal(decode);//这里要用new String()转字符串,不能用.toString()方法,否则返回的是哈希值return new String(bytes1);}/*** 把公钥和私钥保存到根目录* @param algorithm 算法* @param pubPath    公钥路径* @param priPath   私钥路径* @throws NoSuchAlgorithmException* @throws IOException*/private static void generateKeyToFile(String algorithm,String pubPath,String priPath) throws NoSuchAlgorithmException, IOException {// 密钥对生成器对象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 初始化密钥长度keyPairGenerator.initialize(1024);// 生成密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成私钥PrivateKey privateKey = keyPair.getPrivate();// 获取私钥的字节数组byte[] privateKeyEncoded = privateKey.getEncoded();// 使用base64进行编码String privateEncodeString = Base64.encodeBase64String(privateKeyEncoded);System.out.println("私钥:" + privateEncodeString);// 生成公钥PublicKey publicKey = keyPair.getPublic();// 获取公钥的字节数组byte[] publicKeyEncoded = publicKey.getEncoded();// 使用base64进行编码String publicEncodeString = Base64.encodeBase64String(publicKeyEncoded);System.out.println("公钥:" + publicEncodeString);//把公钥和私钥保存到根目录FileUtils.writeStringToFile(new File(pubPath), publicEncodeString,Charset.forName("UTF-8"));FileUtils.writeStringToFile(new File(priPath), privateEncodeString,Charset.forName("UTF-8"));}/*** 读取私钥* @param priPath 私钥的路径* @param algorithm 算法* @return* @throws Exception 返回私钥的key对象*/private static PrivateKey getPrivateKey(String priPath,String algorithm) throws Exception{String privateKeyString=FileUtils.readFileToString(new File(priPath),Charset.defaultCharset());//创建key的工厂KeyFactory keyFactory=KeyFactory.getInstance(algorithm);//创建私钥key的规则PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));//返回私钥对象return keyFactory.generatePrivate(keySpec);}/*** 读取公钥* @param priPath 公钥的路径* @param algorithm 算法* @return* @throws Exception 返回公钥的key对象*/private static PublicKey getPublicKey(String publicPath,String algorithm) throws Exception{String publicKeyString=FileUtils.readFileToString(new File(publicPath),Charset.defaultCharset());//创建key的工厂KeyFactory keyFactory=KeyFactory.getInstance(algorithm);//创建公钥key的规则X509EncodedKeySpec keySpec=new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));//返回公钥对象return keyFactory.generatePublic(keySpec);}
}

欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感谢。如果觉得本文章有帮助到的,点个赞呗,让更多的阅读者看到

Java代码实现非对称加密RSA算法示例相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 非对称加密——RSA算法JAVA代码实践

    文章目录 说明 RSA加解密 测试代码 打印输出 说明 1:下面代码参考自<JAVA加密解密的艺术>,有部分修改,详见原理见原书 2:下面代码是RSA在JAVA中API级别的代码实现,具体 ...

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

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

最新文章

  1. python语言入门m-Python语言入门详解!快速学成Python!
  2. 高性能分布式计算与存储系统设计概要(上)(转)
  3. 三月份总结(后台规范+面试)
  4. Linux中gsub函数,Linux中awk下 gsub函数用法
  5. c语言编写单片机技巧
  6. python图像几何变换_Python 图像处理 OpenCV (5):图像的几何变换
  7. 新版的iMessage就是iOS 10内隐形的浏览器
  8. 互融云融资担保系统:助力企业解决融资难题
  9. 关于破解广州天翼校园 + 小米路由器实现自动上网 突破wifi限制
  10. 系统迁移到ssd 开启哪些服务器,如何使用分区助手完美迁移系统到SSD固态硬盘...
  11. 嵌入式Linux下获取CPU温度方法
  12. Http状态码406(Not Acceptable) 错误问题解决方法
  13. C++如何写adaptable仿函数
  14. 龙芯电脑手动编译安装gcc9.3编译器
  15. 第二章第三题(将英尺转换为米)(convert feet to meters)
  16. ble协议栈从零开始七(linklayer 之 privacy)
  17. 【ESP01S】使用串口调试助手,发送AT指令收回的是乱码/重复一遍AT指令发回的问题
  18. 淘宝购物车页面测试用例
  19. php优秀员工推荐,一个优秀员工与一个优秀的老板
  20. 解决安装pytorch出现的问题

热门文章

  1. GIS 二次开发概述 (整理)
  2. 基于OSGi的企业级开发框架实践——OSGi Annotations
  3. OSGi架构学习与设计
  4. MySQL——基础知识总结超详细版本(一)
  5. 使用hifiasm组装hifi基因组的方法介绍
  6. Mac 修改命令行前缀显示
  7. 计算机网络之无线局域网
  8. vue3+ant design vue+ts实战【ant-design-vue组件库引入】
  9. F-散度(F-divergence)
  10. IDEA快捷键CTRL+ALT+L格式化失效