加密用到的JAR包

 <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-io --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>1.3.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.directory.studio/org.apache.commons.codec --><dependency><groupId>org.apache.directory.studio</groupId><artifactId>org.apache.commons.codec</artifactId><version>1.8</version></dependency>
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
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;
import java.util.HashMap;
import java.util.Map;public class RSAUtils {public static final String CHARSET = "UTF-8";public static final String RSA_ALGORITHM = "RSA";public static Map<String, String> createKeys(int keySize){//为RSA算法创建一个KeyPairGenerator对象KeyPairGenerator kpg;try{kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM);}catch(NoSuchAlgorithmException e){throw new IllegalArgumentException("No such algorithm-->[" + RSA_ALGORITHM + "]");}//初始化KeyPairGenerator对象,密钥长度kpg.initialize(keySize);//生成密匙对KeyPair keyPair = kpg.generateKeyPair();//得到公钥Key publicKey = keyPair.getPublic();String publicKeyStr = Base64.encodeBase64URLSafeString(publicKey.getEncoded());//得到私钥Key privateKey = keyPair.getPrivate();String privateKeyStr = Base64.encodeBase64URLSafeString(privateKey.getEncoded());Map<String, String> keyPairMap = new HashMap<String, String>();keyPairMap.put("publicKey", publicKeyStr);keyPairMap.put("privateKey", privateKeyStr);return keyPairMap;}/*** 得到公钥* @param publicKey 密钥字符串(经过base64编码)* @throws Exception*/public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {//通过X509编码的Key指令获得公钥对象KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);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_ALGORITHM);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);return key;}/*** 公钥加密* @param data* @param publicKey* @return*/public static String publicEncrypt(String data, RSAPublicKey publicKey){try{Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, publicKey);return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), 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_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, privateKey);return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), CHARSET);}catch(Exception e){throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);}}/*** 私钥加密* @param data* @param privateKey* @return*/public static String privateEncrypt(String data, RSAPrivateKey privateKey){try{Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, privateKey);return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), privateKey.getModulus().bitLength()));}catch(Exception e){throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);}}/*** 公钥解密* @param data* @param publicKey* @return*/public static String publicDecrypt(String data, RSAPublicKey publicKey){try{Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, publicKey);return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), publicKey.getModulus().bitLength()), CHARSET);}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;}}

一般公钥和私钥都是配置在properties文件中,所以,提前把公钥私钥准备好

public class Test1 {public static void main (String[] args) throws Exception {Map<String, String> keyMap = RSAUtils.createKeys(1024);
//        String  publicKey = keyMap.get("publicKey");String publicKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIHvSdTGM4SThaSZ9pdsu09wsEyuwRp_w-aSCPajTizykD2DtyxOANaeynYBXibkFtsZ5bujnEwEH5NwqzYdvJUcU-SqriC4wP9uhpdWS7wEAM9kqn9GCT5TN-aqk8RG3X_WwErum-D7obSYm2eqyrGQJsH4WJRU2-IMeUrUUlawIDAQAB";
//        String  privateKey = keyMap.get("privateKey");String  privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIge9J1MYzhJOFpJn2l2y7T3CwTK7BGn_D5pII9qNOLPKQPYO3LE4A1p7KdgFeJuQW2xnlu6OcTAQfk3CrNh28lRxT5KquILjA_26Gl1ZLvAQAz2Sqf0YJPlM35qqTxEbdf9bASu6b4PuhtJibZ6rKsZAmwfhYlFTb4gx5StRSVrAgMBAAECgYAmR35G1fp5E64zRcz8nZm_tFF28ZHdjT4UVv__FMD2n4dLO33MUq0nWIhisVS2Lodbz71W0lH4kJB9AwuRUo258KKQp7Rx_PH_LKQgKbB-W4EAyzQKNxDC8JXn0kivNw_EEYPuFc_EErvrRlTvoAbRZNaqO05mK8C30dSPlZA6cQJBAMGvoZ-ZRH3GaYdZNoGrY9nob57QY_LMAltMZijxqu4nwMU6SppzhlqzHQjeyef2NB63-qr_QYfK3B-Ou5oq4DcCQQCz6iUYkL6fFGgyrHDn4VjYJ7dlsJXOJQAy2o9Zr1LjqhX6tyLC9HufzYrZA71qbKjEAZ1noB-mhjHW0sL8tsJtAkEAmKINnjYsUWnQs8bMO3eTIqAXhnH2sdmvab9VKqL37uII-eQr8ndjw4ovMVRQjKnq_OJDegnZ3Gcy_POAR8fOFQJBAIXInc8XivfF9_l-avKyihsp5WEznyHMN8qY5TG-gneSeYeWeL3ZiLf64r2e31Hs_M3LmZ193ys37IWe8alzyT0CQHjp3hCz9EuEn1HcYJrGtm1G7Tduq7RhY8OABhOPTMUL2hkSXKOcvaQk6tbpjR_23HT0rGaFjiRYb1W0RPqXW28";System.out.println("公钥: \n\r" + publicKey);System.out.println("私钥: \n\r" + privateKey);System.out.println("公钥加密——私钥解密");String str = "站在大明门前守卫的禁卫军,事先没有接到\n" +"有关的命令,但看到大批盛装的官员来临,也就\n" +"以为确系举行大典,因而未加询问。进大明门即\n" +"为皇城。文武百官看到端门午门之前气氛平静,\n" +"城楼上下也无朝会的迹象,既无几案,站队点名\n" +"的御史和御前侍卫“大汉将军”也不见踪影,不免\n" +"心中揣测,互相询问:所谓午朝是否讹传?";System.out.println("\r明文:\r\n" + str);System.out.println("\r明文大小:\r\n" + str.getBytes().length);String encodedData = RSAUtils.publicEncrypt(str, RSAUtils.getPublicKey(publicKey));System.out.println("密文:\r\n" + encodedData);String decodedData = RSAUtils.privateDecrypt(encodedData, RSAUtils.getPrivateKey(privateKey));System.out.println("解密后文字: \r\n" + decodedData);}
}

原文:https://blog.csdn.net/cz0217/article/details/78426733

JAVA--RSA加密相关推荐

  1. java RSA加密解密--转载

    原文地址:http://www.blogjava.net/icewee/archive/2012/05/19/378570.html 该工具类中用到了BASE64,需要借助第三方类库:javabase ...

  2. JAVA——RSA加密与解密

    基本概念 Base64:Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. RSA: RSA加密算法是一种非对称加密算法 ...

  3. java RSA加密解密实现(含分段加密)

    该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detail/centralperk/50255 ...

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

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

  5. Java RSA加密解密

    转自 http://blog.csdn.net/bbld_/article/details/38777491 概述 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数 ...

  6. java 在线rsa解密_通用的Java RSA加密工具类,可在线验证通过

    /** * RSA加密工具类 * 使用PKCS1_PADDING填充,密钥长度1024 * 加解密结果在这里测试通过:http://tool.chacuo.net/cryptrsaprikey * 注 ...

  7. java rsa加密解密_前端实现对请求参数进行RSA加密amp;解密,针对字符串过长进行分段加密amp;分段解密的处理...

    前言 在需求开发中,为了安全起见,我们都会难免遇到需要对一些敏感参数进行加密或者解密.所以,今天给大家分享的就是使用jsencrypt对请求参数进行RSA加密与解密,发这篇文章其实主要因为近期我的一位 ...

  8. JAVA——RSA加密【X509EncodedKeySpec、PKCS8EncodedKeySpec、RSAPublicKeySpec、RSAPrivateKeySpec】

    基本概念 RSA加密算法:RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shami ...

  9. Java RSA加密(一)--BCD输出

    代码如下: import java.math.BigInteger; import java.security.KeyFactory; import java.security.KeyPair; im ...

  10. android java rsa加密_Android RSA与Java RSA加密不一样标准产生问题的解决方法

    最近作一个基于android的客户端,客户端与Java服务器 (MyEclipse自带的Tomcat服务器)的通讯须要实施安全方案.而本人是使用非对称密钥来对数据进行加密的,客户端用公钥加密,服务器用 ...

最新文章

  1. python的下载和安装步骤-下载及安装Python详细步骤
  2. visual studio 2015开发nodejs教程1搭建环境
  3. Spring核心技术原理-(1)-通过Web开发演进过程了解一下为什么要有Spring?
  4. Android Binder机制(1501210451 张志康)
  5. # PHP - 使用PHPMailer发邮件
  6. Android 创建,验证和删除桌面快捷方式 (删除快捷方式测试可用)
  7. 2021快手短剧数据报告
  8. matlab输出lccde_Matlab与Visual C++混合编程处理全站仪数据的方法
  9. LeetCode 285. Inorder Successor in BST
  10. 不忘初心,砥砺前行;只争朝夕,不负韶华——国家开放大学2018年度首届优秀青年教师总结报告
  11. 永宏plc和台达vfd-m变頻器modbs rtu通讯程序 史上最好用的plc和变頻器rtu通讯程序
  12. 计算机多媒体简历,[计算机个人简历模板范文]计算机多媒体专业个人简历
  13. MongoDB数据库(使用、基本操作)
  14. Squid代理权限的设置
  15. ORACLE局域网连接
  16. 新型冠状病毒数据可视化分析
  17. MC1488 MC1489
  18. 趣味三角——第3章——6个三角函数的成熟过程
  19. python3ide安卓版官网下载_python3.9下载-Python下载v3.9.0 官方最新版【x86|x64】-西西软件下载...
  20. 服务器前端机中转机制,『中高级前端面试』之终极知识点

热门文章

  1. 文件大小Byte转化为KB、MB、GB等
  2. maya! board_maya人物跑步动画制作中文教程
  3. .Net Core托管服务
  4. 【雷达成像】基于距离多普勒(RD)、CS、RM算法实现机载雷达成像含Matlab源码
  5. FPGA中除法是怎么实现的?
  6. python pip安装第三方库老是报错_Python使用pip安装第三方库时报错的解决方案
  7. 图片打印(iframe)
  8. Ubuntu16.04 读SD卡失败 mount: unknown filesystem type exfat
  9. IIS配置网站访问权限和安全
  10. idea中调试时F8,F7失效等快捷键失效