RSA加密解密-java
RSA加密解密
maven依赖:
<!-- RSA --><dependency><groupId>org.apache.axis</groupId><artifactId>axis</artifactId><version>1.4</version></dependency><!-- base64 --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version></dependency>
RSAUtil工具类代码:
package common;import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;import javax.crypto.Cipher;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileWriter;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;/*** @program: Demo* @Date: 2019/2/21 22:56* @Author: LiJc* @Description:*/
public class RSAUtil {/*** 转密钥字符串(base64编码)** @return*/public static String getKeyString(Key key) throws Exception {byte[] keyBytes = key.getEncoded();String s = new String(Base64.encodeBase64(keyBytes));return s;}/*** 得到公钥* @param publicKey 密钥字符串(经过base64编码)* @throws Exception*/public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {//通过X509编码的Key指令获得公钥对象KeyFactory keyFactory = KeyFactory.getInstance("RSA");X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);return key;}/*** 得到私钥* @param privateKey 密钥字符串(经过base64编码)* @throws Exception*/public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {//通过PKCS#8编码的Key指令获得私钥对象KeyFactory keyFactory = KeyFactory.getInstance("RSA");PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);return key;}/*** 生成密钥对* @param pubfilePath 公钥存放的文件路径* @param prifilePath 私钥存放的文件路径*/public static void genKeyPair(String pubfilePath, String prifilePath) {// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = null;try {keyPairGen = KeyPairGenerator.getInstance("RSA");} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 初始化密钥对生成器,密钥大小为96-1024位keyPairGen.initialize(1024, new SecureRandom());// 生成一个密钥对,保存在keyPair中KeyPair keyPair = keyPairGen.generateKeyPair();// 得到私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 得到公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();try {// 得到公钥字符串String publicKeyString = getKeyString(publicKey);// 得到私钥字符串String privateKeyString = getKeyString(privateKey);// 将密钥对写入到文件FileWriter pubfw = new FileWriter(pubfilePath);FileWriter prifw = new FileWriter(prifilePath);BufferedWriter pubbw = new BufferedWriter(pubfw);BufferedWriter pribw = new BufferedWriter(prifw);pubbw.write(publicKeyString);pribw.write(privateKeyString);pubbw.flush();pubbw.close();pubfw.close();pribw.flush();pribw.close();prifw.close();} catch (Exception e) {e.printStackTrace();}}/*** 公钥加密* @param data 需要加密的内容* @param publicKey 公钥* @return*/public static String publicEncrypt(String data, RSAPublicKey publicKey){try{Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);return new String(Base64.encodeBase64(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes("UTF-8"), publicKey.getModulus().bitLength())));}catch(Exception e){throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);}}/*** 私钥解密* @param data 需要加密的内容* @param privateKey 私钥* @return*/public static String privateDecrypt(String data, RSAPrivateKey privateKey){try{Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), "UTF-8");}catch(Exception e){throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);}}private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize){int maxBlock = 0;if(opmode == Cipher.DECRYPT_MODE){maxBlock = keySize / 8;}else{maxBlock = keySize / 8 - 11;}ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] buff;int i = 0;try{while(datas.length > offSet){if(datas.length-offSet > maxBlock){buff = cipher.doFinal(datas, offSet, maxBlock);}else{buff = cipher.doFinal(datas, offSet, datas.length-offSet);}out.write(buff, 0, buff.length);i++;offSet = i * maxBlock;}}catch(Exception e){throw new RuntimeException("加解密阀值为["+maxBlock+"]的数据时发生异常", e);}byte[] resultDatas = out.toByteArray();IOUtils.closeQuietly(out);return resultDatas;}
}
单元测试:
1.先生成密钥对test1()方法。
2.从密钥的txt文件中读取密钥内容进行加解密。
package common;import org.junit.Test;import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;/*** @program: Demo* @Date: 2019/2/21 23:07* @Author: LiJc* @Description:*/
public class RSATest {/*** 生成密钥对*/@Testpublic void test1(){RSAUtil.genKeyPair("D:\\公钥.txt","D:\\私钥.txt");}@Testpublic void test2() throws InvalidKeySpecException, NoSuchAlgorithmException {String content = "真香警告!";System.out.println("原始内容为:"+content);String pubkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCQ1IqhPNo8M/R1pHpocNuJ6enntJoB7OAaJrVoaHbvJOI4APkheX0J1UKizOGQNRr/V6vp3B+3MrPVGJ4lfRirrgnIK86PD5K/MChSWhxslWf3jQxr7AO8rMIPre7uoGjmY3pbSY82QUGDEhgDVsWTLTjWWqFQHVTwEfBPGgaktQIDAQAB";//根据公钥key获取公钥RSAPublicKey publicKey = RSAUtil.getPublicKey(pubkey);//加密String content1 = RSAUtil.publicEncrypt(content, publicKey);System.out.println("加密后内容为:"+content1);String prikey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJDUiqE82jwz9HWkemhw24np6ee0mgHs4BomtWhodu8k4jgA+SF5fQnVQqLM4ZA1Gv9Xq+ncH7cys9UYniV9GKuuCcgrzo8Pkr8wKFJaHGyVZ/eNDGvsA7yswg+t7u6gaOZjeltJjzZBQYMSGANWxZMtONZaoVAdVPAR8E8aBqS1AgMBAAECgYBtteOSApPa2QyM9VyYsy1LCrvafs/PN44HoVz4S3IU9B69h9cxCWOzyC3jP0p7QA9EcDhVPh90Wl8pxK0//sRpWZrKps3ZqCQKogLSHTIaRJvvgQwN26KtIwSoXDwKqpmyhufIhXdFDmSIKb8v8rF3Sl3Mt5I+hDT83fnTjyPUPQJBAOBNObrgZQ7CvMuwtKilWhAqlNbhibfc3k4dtJ+23uixUgHq+WME6w7B0NUixT6ua7v+RKZD1RO9ANDGCEIQzfsCQQClTDPsjrkerRBsXrge6xK2drisIpEFBdYoIz9lYmCHXJctkx5nhLogxxTeAJgFWBIcOgrx5OCYOQgr5p6FikkPAkA45j470sqwCOR9w3DAy1lienrRW9tkwem+5Tg5v9kiLEFCbUogPVInpzEDsFNbCEIaKXFewBxganS3gVT89WhbAkAV90NrKyg0iGEHVar4CNsKvkoaLdnBph3oZY62JVWYh1hbqRJARWYKlwoR2lhZVXPKpnfv3y9tax7H3rSwIElHAkB7j65B6+L8Ty0RiEzHCOVXnUoUTai/BZfQ5erA9yVM/VW8p1mE/qhJOTQ5hFniO0dicl3YZyaYHW1D+Z1V4naO";//获取私钥RSAPrivateKey privateKey = RSAUtil.getPrivateKey(prikey);//解密String content2 = RSAUtil.privateDecrypt(content1, privateKey);System.out.println("解密后内容为:"+content2);}
}
调用test1()生成密钥对 (注意:每次生成的都是不一样的,代码中的密钥对为我此次测试生成的密钥对)
得到如下文件:
调用test2()的测试结果:
RSA加密解密-java相关推荐
- RSA加密解密及数字签名Java实现--转
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...
- C# Java间进行RSA加密解密交互
C# Java间进行RSA加密解密交互 原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益, ...
- Java使用RSA加密解密签名及校验
RSA加密解密类: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; i ...
- C# Java间进行RSA加密解密交互(二)
接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与项目中要求的有所出入.在项目中,客户端(Java)的 ...
- angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现
今天实现了下AES和RSA加密解密,主要的功能是对前后端交互数据进行加密解密,为什么要用到两个算法呢,首先RSA默认的话加密长度是有限的100多个byte吧大约,并且需要公钥私钥,而AES加密没有限制 ...
- java rsa 验_Java使用RSA加密解密签名及校验
RSA加密解密类: package com.ihep; import java.io.BufferedReader; import java.io.BufferedWriter; import jav ...
- 条理清晰的入门:使用Java实现RSA加密解密
条理清晰的入门:使用Java实现RSA加密解密 什么是RSA 使用Java 需要导入的头文件 生成公钥.私钥 进行加密解密 密钥的存储 密文的存储.读取 什么是RSA 翻一下以前的密码学笔记,找到了! ...
- RSA加密解密算法的java实现
最近有一个外部合作项目要求在数据传输过程中使用RSA加密算法对数据进行加密,所以需要编写一个加解密的工具类,因为对方不是java语言,所以是各自实现的这个工具,本文主要讨论实现以及双方调试过程中的一些 ...
- RSA node解密 java 加密的注意事项
java 代码 Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding"); 代替 Cipher.getInstance(&q ...
最新文章
- 如何有效地提升 JavaScript 水平?
- Push rejected: Push to origin/master was rejected错误解决方案
- Linux平台Oracle安装脚本
- STM32F4_LCD12864并行驱动
- 为表增加字段与拷贝数据到另一个表
- 位枚举(Bit Flags)
- ASP.NET服务器控件查询
- SQL Server2005 表分区三步曲(zz)
- URL 编码是什么?
- PE文件格式详解(0)
- java开发工程师报名费多少_JAVA软件工程师资格证书 怎么考
- 使用markdown-it插件
- 100多个常用 API 接口整理大全
- ubuntu eclipse java_ubuntu 下安装eclipse amp;java环境配置
- cryptography
- Mysql varchar类型长度计算(mysql字段长度计算)
- 果园机器人反思稿_果园机器人读后感
- 新手必须掌握的20个摄影构图法 转
- Qt+ECharts开发笔记(五):ECharts的动态排序柱状图介绍、基础使用和Qt封装Demo
- prism IRegionMemberLifetime(区域成员生命周期)