首页 > 其他分享 >RSA分段加密方案

RSA分段加密方案

时间:2023-12-05 10:36:51浏览次数:22  
标签:java String RSA 分段 import byte 加密

1.背景

RSA加密对加密的内容是有长度限制的,如果超出了长度限制,就会报错。所以需要采用分段加密,案例如下。

2.代码

  1 package com.demo.util;
  2 
  3 import org.apache.commons.codec.binary.Base64;
  4 import org.apache.commons.lang3.ArrayUtils;
  5 
  6 import javax.crypto.Cipher;
  7 import java.io.ByteArrayOutputStream;
  8 import java.net.URLDecoder;
  9 import java.net.URLEncoder;
 10 import java.nio.charset.StandardCharsets;
 11 import java.security.*;
 12 import java.security.interfaces.RSAPrivateKey;
 13 import java.security.interfaces.RSAPublicKey;
 14 import java.security.spec.PKCS8EncodedKeySpec;
 15 import java.security.spec.X509EncodedKeySpec;
 16 import java.util.HashMap;
 17 import java.util.Map;
 18 
 19 /**
 20  * @author mingtian
 21  * @desc rsa 分段加解密工具类
 22  */
 23 public final class RsaUtils {
 24 
 25     // RSA最大加密明文大小
 26     private static final int MAX_ENCRYPT_BLOCK = 117;
 27 
 28     // RSA最大解密密文大小
 29     private static final int MAX_DECRYPT_BLOCK = 128;
 30 
 31     private RsaUtils() {
 32     }
 33 
 34     /**
 35      * 获取公钥和私钥对,key为公钥,value为私钥
 36      *
 37      * @return
 38      * @throws NoSuchAlgorithmException
 39      */
 40     public static Map<String, String> genKeyPair() throws NoSuchAlgorithmException {
 41         KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
 42         keyPairGen.initialize(1024, new SecureRandom());
 43         KeyPair keyPair = keyPairGen.generateKeyPair();
 44         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
 45         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
 46         String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()), StandardCharsets.UTF_8);
 47         String privateKeyString = new String(Base64.encodeBase64(privateKey.getEncoded()), StandardCharsets.UTF_8);
 48         Map<String, String> keyPairMap = new HashMap<>();
 49         keyPairMap.put("publicKey", publicKeyString);
 50         keyPairMap.put("privateKey", privateKeyString);
 51         return keyPairMap;
 52     }
 53 
 54     /**
 55      * 加密
 56      *
 57      * @param str
 58      * @param publicKey
 59      * @return
 60      * @throws Exception
 61      */
 62     public static String encrypt(String str, String publicKey) throws Exception {
 63         byte[] decoded = Base64.decodeBase64(publicKey);
 64         RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
 65         Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
 66         cipher.init(1, pubKey);
 67         // 分段加密
 68         // URLEncoder编码解决中文乱码问题
 69         byte[] data = URLEncoder.encode(str, "UTF-8").getBytes(StandardCharsets.UTF_8);
 70         // 加密时超过117字节就报错。为此采用分段加密的办法来加密
 71         byte[] enBytes = null;
 72         for (int i = 0; i < data.length; i += MAX_ENCRYPT_BLOCK) {
 73             // 注意要使用2的倍数,否则会出现加密后的内容再解密时为乱码
 74             byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i, i + MAX_ENCRYPT_BLOCK));
 75             enBytes = ArrayUtils.addAll(enBytes, doFinal);
 76         }
 77         return Base64.encodeBase64String(enBytes);
 78     }
 79 
 80     /**
 81      * 公钥分段解密
 82      *
 83      * @param str
 84      * @param privateKey
 85      * @return
 86      * @throws Exception
 87      */
 88     public static String decrypt(String str, String privateKey) throws Exception {
 89         // 获取公钥
 90         byte[] decoded = Base64.decodeBase64(privateKey);
 91         RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
 92         Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
 93         cipher.init(2, priKey);
 94         byte[] data = Base64.decodeBase64(str.getBytes("UTF-8"));
 95 
 96         // 返回UTF-8编码的解密信息
 97         int inputLen = data.length;
 98         ByteArrayOutputStream out = new ByteArrayOutputStream();
 99         int offSet = 0;
100         byte[] cache;
101         int i = 0;
102         // 对数据分段解密
103         while (inputLen - offSet > 0) {
104             if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
105                 cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);
106             } else {
107                 cache = cipher.doFinal(data, offSet, inputLen - offSet);
108             }
109             out.write(cache, 0, cache.length);
110             i++;
111             offSet = i * 128;
112         }
113         byte[] decryptedData = out.toByteArray();
114         out.close();
115         return URLDecoder.decode(new String(decryptedData, StandardCharsets.UTF_8), String.valueOf(StandardCharsets.UTF_8));
116     }
117 }

 

标签:java,String,RSA,分段,import,byte,加密
From: https://www.cnblogs.com/ming-blogs/p/17876625.html

相关文章

  • 详解RSA加密原理
    密码学密码学是指研究信息加密,破解密码的技术科学。密码学的起源可追溯到2000年前。而当今的密码学是以数学为基础的。密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应......
  • 关于C#的RSA加密(用于泛微OA)
    由于项目需要,需要用公钥对秘钥进行加密,且对接系统用C#开发,需求是这样的:  注册许可证时返回的公钥spk对秘钥信息secrit进行加密。由于公钥spk是字符串,但C#中只认可的xml字符串的公钥才能够进行加密,可以使用以下方法,先进行转换,将公钥字符串转换成XML,再进行加密,就可以得到加密......
  • 如何实现 token 加密
    以最常见的token格式jwt为例,token分为三段,分别是header、payload、signature。其中,header标识签名算法和令牌类型;payload标识主体信息,包含令牌过期时间、发布时间、发行者、主体内容等;signature是使用特定的算法对前面两部分进行加密,得到的加密结果。token有防篡改的......
  • RSA
     菜鸟营互助:CTFCryptoRSA合集(新生赛难度)_历届ctf竞赛rsa题目_Cot287的博客-CSDN博客Crypto中常用的数据类型互转方式Crypto中常用的数据类型互转方式_long_to_bytes-CSDN博客  》。。。。。。。。。。。。。。。。。。。。。。。。题目思密达。。。。。。。。。。。。......
  • Apache加密
    配置TLS加密的虚拟主机(443/TLS)SSl提供了3中服务,保证数据的安全传输认证用户和服务器,确保数据发送到正确的客户机和服务器;加密数据以防止数据中途被窃取;维护数据的完整性,确保数据在传输过程中不被改变客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。Web服务器......
  • 『坚如磐石的 PieCloudDB』:透明加密模块的设计与实现
    导读:2月17日,由中国开源软件推进联盟PostgreSQL分会&中科院软件所&CSDN联合举办的“中国PostgreSQL数据库生态大会”盛大召开。拓数派(OpenPie)作为冉冉升起的新一代云原生分布式数据库厂商,受邀参加本届大会。 本文为演讲的文字版摘要,主要内容包括: 透明加密的设计思路 透明......
  • AES加密技术:原理与应用
    一、引言随着信息技术的飞速发展,数据安全已成为越来越受到重视的领域。加密技术作为保障数据安全的重要手段,在信息安全领域发挥着举足轻重的作用。AES(AdvancedEncryptionStandard)作为一种对称加密算法,自1990年代以来,已成为加密技术领域的佼佼者,广泛应用于各种信息安全领域。本文......
  • AES加密技术:原理与应用
    一、引言随着信息技术的飞速发展,数据安全已成为越来越受到重视的领域。加密技术作为保障数据安全的重要手段,在信息安全领域发挥着举足轻重的作用。AES(AdvancedEncryptionStandard)作为一种对称加密算法,自1990年代以来,已成为加密技术领域的佼佼者,广泛应用于各种信息安全领域。......
  • Elastic Universal Profiling
    ElasticObservability8.10introducesthegeneralavailabilityreleaseofElasticUniversalProfiling™ andenhancementstotheElasticAIAssistantforObservability.Elastic® UniversalProfilingisawhole-system,always-on,continuousprofilingsolution......
  • DES加密技术概述与应用
    一、引言随着信息技术的飞速发展,数据安全已成为越来越受到重视的问题。数据加密技术作为保障信息安全的核心技术之一,得到了广泛的研究和应用。DES(DataEncryptionStandard)作为一种对称加密算法,凭借其高效、可靠的加密特性,成为了数据加密领域的佼佼者。本文将对DES加密技术进行简要......