Java数据加密、解密
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数据加密、解密相关推荐
- java数据加密解密代码_java使用RSA加密方式实现数据加密解密的代码
RSA的应用 RSA是一种非对称加密算法.现在,很多登陆表单的密码的都采用RSA加密,例如京东中的登陆使用公钥对密码进行加密 java使用RSA加密方式实现数据加密解密,需要首先产生私钥和公钥 测试代 ...
- java使用RSA加密方式实现数据加密解密
全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用RSA加密方式实现数据加密解密,需要首先产生私钥和公钥 测试代码 public static void main(String arg ...
- JAVA数据加密压缩传输给服务端(Gzip加AES)
上一话说到HTTP数据传输用Gzip方式压缩,用springboot分别写了客户端和服务端的代码测试. 对应博客地址 Java数据压缩HTTP方式传输Gzip(附带测试代码及springboot-HT ...
- RSA数据加密解密(各种语言)
RSA数据加密解密文档 增强数据传输与本地日志的数据安全 数据加密方式 使用rsa加密算法,客户端公钥加密,服务端私钥解密 (若单次传输数据量过大,之后可引入aes rsa只加密iv部分) 数据加密步 ...
- Java加解密的艺术书摘
Java加解密的艺术 密码学常用术语 明文(Plaintext):指待加密信息.明文可以是文本文件.图片文件.二进制数据等. 密文(Ciphertext):指经过加密后的明文.密文通常以文本.二进制数 ...
- Java加密解密入门
一 概述 Java加密解密概述 Java安全领域分为四个部分:JCA-Java加密体系结构:JCE-Java加密扩展包:JSSE-Java安全套接字扩展包:JAAS-Java鉴别与安全服务. JCA提 ...
- BUUCTF 新年快乐 内涵的软件 Java逆向解密 刮开有奖
文章目录 新年快乐 内涵的软件 Java逆向解密 贴脚本: 刮开有奖 sub_4010F0((int)&v7, 0, 10);(加密函数) sub_401000((int)&v26, ...
- 数据结构(哈夫曼树+KMP)之 数据加密+解密
数据结构(哈夫曼树+KMP)之 数据加密+解密 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 1 ...
- java中解密技术是什么_详解Java 加密解密技术的分类和归纳
这篇文章主要介绍了Java加密解密基础分类方法汇总的相关资料,需要的朋友可以参考下 Java 加密解密基础: 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信 ...
最新文章
- python解压zip文件_python-29 python解压压缩包的几种方法
- SqlBulkCopy批量插入数据库
- XidianOJ 1090 爬树的V8
- 计算机指纹识别的原理步骤,指纹识别原理和过程
- 7-模块开发卷宗(GB8567——88)
- Java中的序列化问题
- 计算机网络学习笔记(0. 引言)
- 全球AI芯片企业排行:英伟达第1,华为第12(七家中国公司入围Top24)
- javaweb简单源代码_Java Web轻松学39 - JSP核心原理
- 让 Chrome 在后台运行
- 华为 IPD 集成产品开发流程的缺点和适用局限性
- 利用python批量创建文件夹、批量创建文件、批量复制文件到指定文件夹
- c语言实验报告参考文献,c语言编程参考文献
- 哈佛大学联合团队新突破:在计算过程中实现量子纠错
- java基础知识学习小总结(一)
- 透明网关与透明防火墙
- iOS 屏幕录制 (可选录入麦克风的声音)
- 手机便签的字体大小怎么调?
- SE16N与SE16区别
- Linux搭建DNS服务