Java数据加密、解密

package io.futurecloud.common.pay;
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;

/**

  • @authoer:huangjialin

  • @createDate:2022/6/13

  • @description:
    */
    public class Test {
    public static final String CHARSET = “UTF-8”;
    public static final String RSA_ALGORITHM = “RSA”; // ALGORITHM ['ælgərɪð(ə)m] 算法的意思

     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装载公钥和私钥Map<String, String> keyPairMap = new HashMap<String, String>();keyPairMap.put("publicKey", publicKeyStr);keyPairMap.put("privateKey", privateKeyStr);// 返回mapreturn 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初始化方法使用一个模式参数opmod,并用此模式初始化Cipher对象。此外还有其他参数,包括密钥key、包含密钥的证书certificate、算法参数params和随机源random。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);}}//rsa切割解码  , ENCRYPT_MODE,加密数据   ,DECRYPT_MODE,解密数据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) {//可以调用以下的doFinal()方法完成加密或解密数据: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;}// 简单测试____________public static void main(String[] args) throws Exception {Map<String, String> keyMap = Test.createKeys(2048);String publicKey = keyMap.get("publicKey");String privateKey = keyMap.get("privateKey");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 = Test.publicEncrypt(str, Test.getPublicKey(publicKey));  //传入明文和公钥加密,得到密文System.out.println("密文:\r\n" + encodedData);String decodedData = Test.privateDecrypt(encodedData, Test.getPrivateKey(privateKey)); //传入密文和私钥,得到明文System.out.println("解密后文字: \r\n" + decodedData);
    

    }
    }

Java数据加密、解密相关推荐

  1. java数据加密解密代码_java使用RSA加密方式实现数据加密解密的代码

    RSA的应用 RSA是一种非对称加密算法.现在,很多登陆表单的密码的都采用RSA加密,例如京东中的登陆使用公钥对密码进行加密 java使用RSA加密方式实现数据加密解密,需要首先产生私钥和公钥 测试代 ...

  2. java使用RSA加密方式实现数据加密解密

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用RSA加密方式实现数据加密解密,需要首先产生私钥和公钥 测试代码 public static void main(String arg ...

  3. JAVA数据加密压缩传输给服务端(Gzip加AES)

    上一话说到HTTP数据传输用Gzip方式压缩,用springboot分别写了客户端和服务端的代码测试. 对应博客地址 Java数据压缩HTTP方式传输Gzip(附带测试代码及springboot-HT ...

  4. RSA数据加密解密(各种语言)

    RSA数据加密解密文档 增强数据传输与本地日志的数据安全 数据加密方式 使用rsa加密算法,客户端公钥加密,服务端私钥解密 (若单次传输数据量过大,之后可引入aes rsa只加密iv部分) 数据加密步 ...

  5. Java加解密的艺术书摘

    Java加解密的艺术 密码学常用术语 明文(Plaintext):指待加密信息.明文可以是文本文件.图片文件.二进制数据等. 密文(Ciphertext):指经过加密后的明文.密文通常以文本.二进制数 ...

  6. Java加密解密入门

    一 概述 Java加密解密概述 Java安全领域分为四个部分:JCA-Java加密体系结构:JCE-Java加密扩展包:JSSE-Java安全套接字扩展包:JAAS-Java鉴别与安全服务. JCA提 ...

  7. BUUCTF 新年快乐 内涵的软件 Java逆向解密 刮开有奖

    文章目录 新年快乐 内涵的软件 Java逆向解密 贴脚本: 刮开有奖 sub_4010F0((int)&v7, 0, 10);(加密函数) sub_401000((int)&v26, ...

  8. 数据结构(哈夫曼树+KMP)之 数据加密+解密

    数据结构(哈夫曼树+KMP)之 数据加密+解密 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 1 ...

  9. java中解密技术是什么_详解Java 加密解密技术的分类和归纳

    这篇文章主要介绍了Java加密解密基础分类方法汇总的相关资料,需要的朋友可以参考下 Java 加密解密基础: 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信 ...

最新文章

  1. python解压zip文件_python-29 python解压压缩包的几种方法
  2. SqlBulkCopy批量插入数据库
  3. XidianOJ 1090 爬树的V8
  4. 计算机指纹识别的原理步骤,指纹识别原理和过程
  5. 7-模块开发卷宗(GB8567——88)
  6. Java中的序列化问题
  7. 计算机网络学习笔记(0. 引言)
  8. 全球AI芯片企业排行:英伟达第1,华为第12(七家中国公司入围Top24)
  9. javaweb简单源代码_Java Web轻松学39 - JSP核心原理
  10. 让 Chrome 在后台运行
  11. 华为 IPD 集成产品开发流程的缺点和适用局限性
  12. 利用python批量创建文件夹、批量创建文件、批量复制文件到指定文件夹
  13. c语言实验报告参考文献,c语言编程参考文献
  14. 哈佛大学联合团队新突破:在计算过程中实现量子纠错
  15. java基础知识学习小总结(一)
  16. 透明网关与透明防火墙
  17. iOS 屏幕录制 (可选录入麦克风的声音)
  18. 手机便签的字体大小怎么调?
  19. SE16N与SE16区别
  20. Linux搭建DNS服务

热门文章

  1. 思考:智能化运维的发展
  2. CTeX下的WinEdt和GSview相关的破解和自动补足
  3. 编写计算机程序的核心是什么,程序的核心是什么
  4. Vue后台管理系统项目(4)路由的搭建
  5. USACO比赛题泛刷
  6. 【python 图片识别】python识别图片是不是包含二维码
  7. GNSS第十一周作业
  8. Leetcode 1386:安排电影院座位(超详细的解法!!!)
  9. Docker 设置日志文件限制最多3个,最大5M
  10. spring事务的隔离级别和传播特性详解(附实例)