RSA 敏感数据加解密方案

2023-10-13 14:30

本文主要是介绍RSA 敏感数据加解密方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RSA 敏感数据加解密方案

文章目录

  • RSA 敏感数据加解密方案
    • RSA密码
    • RSA加解密算法
    • 举个例子
      • 加密
      • 解密
    • 超长文本加密方案
    • REFERENCES

手机用户请横屏获取最佳阅读体验,REFERENCES中是本文参考的链接,如需要链接和更多资源,可以扫码加入『知识星球』(文末)获取长期知识分享服务。


RSA密码

RSA密码是1978年美国麻省理工学院三位密码学者R.L.Rivest、A.Shamir和L.Adleman提出的一种基于大合数因子分解困难性的公开密钥密码。由于RSA密码既可用于加密,又可用于数字签名,通俗易懂,因此RSA密码已成为目前应用最广泛的公开密钥密码。RSA算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法。在了解RSA算法之前,先熟悉下几个术语,根据密钥的使用方法,可以将密码分为对称密码和公钥密码。

  • 对称密码:加密和解密使用同一种密钥的方式
  • 公钥密码:加密和解密使用不同的密码的方式,因此公钥密码通常也称为非对称密码。

RSA加解密算法

1.随机地选择两个大素数p和q,而且保密;

2.计算n=pq,将n公开;

3.计算φ(n)=(p-1)(q-1),对φ(n)保密;

4.随机地选取一个正整数e,1<e<φ(n)且(e,φ(n))=1,将e公开;

5.根据ed=1(mod φ(n)),求出d,并对d保密;

6.加密运算:c=m^e(mod n); 也就是说对密文进行D次方后除以N的余数就是明文,这就是RSA解密过程。知道D和N就能进行解密密文了,所以D和N的组合就是私钥

7.解密运算:m=c^d(mod n)。

注意:在加密运算和解密运算中,m和c的值都必须小于n,也就是说,如果明文(或密文)太大,必须进行分组加密(或解密)

RSA的加密方式和解密方式是相同的,加密是求``e次方的mod n;解密是求d次方的mod n,此处d`是解密(Decryption)的首字母;n是数字(Number)的首字母;e是加密(Encrypt)的首字母。

举个例子

小写转为大写,便于阅读,

表达式约定

在这里插入图片描述

求解方式

在这里插入图片描述

N

我们准备两个很小对质数,
p = 17
q = 19
N = p * q = 323

L

L 是 p-1 和 q-1的最小公倍数,可用如下表达式表示L = lcm(p-1, q-1)

L`= lcm(16,18) = 144,即144为16和18对最小公倍数

E

求E必须要满足2个条件:1 < E < L ,gcd(E,L)=1,即1 < E < 144,gcd(E,144) = 1
E和144互为质数,5显然满足上述2个条件
故E = 5,此时公钥=(E,N)= (5,323)

D

求D也必须满足2个条件:1 < D < L,E*D mod L = 1
即1 < D < 144,5 * D mod 144 = 1
显然当D= 29 时满足上述两个条件
1 < 29 < 144
5*29 mod 144 = 145 mod 144 = 1
此时私钥=(D,N)=(29,323)

加密

准备的明文必须时小于N的数,因为加密或者解密都要mod N其结果必须小于N
假设明文 = 123
则 密文=明文^E mod N=123^5 mod 323=225

解密

明文=密文^D mod N=225^29 mod 323=123
解密后的明文为123。

好了至此RSA的算法原理已经讲解完毕,是不是很简单?

超长文本加密方案

问题原因:
前端敏感数据加密,文本过长导致加密失败。

日志

Data must not be longer than 245 bytes
javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes

原因: 待加密数据超长的原因

处理方式: 分片加解密

/** @ProjectName: 编程学习* @Copyright:   2020 HangZhou Yiyuery Dev, Ltd. All Right Reserved.* @address:     微信搜索公众号「架构探险之道」获取更多资源。* @date:        2020/8/15 4:50 下午* @description: 本内容仅限于编程技术学习使用,转发请注明出处.*/
package com.dsb.framework.boot.security.ed;import org.apache.commons.io.IOUtils;
import org.springframework.util.Base64Utils;import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;/*** <p>* RSA 加解密工具类* </p>** @author Yiyuery* @date 2020/8/15 4:50 下午*/
public class RsaAssistant {/*** 算法名称*/private static final String KEY_ALGORITHM = "RSA";/*** 密钥长度*/private static final int KEY_SIZE = 2048;/*** RSA最大加密明文大小 KEY_SIZE/8-11*/private static final int MAX_ENCRYPT_BLOCK = 245;/*** RSA最大解密密文大小 KEY_SIZE/8*/private static final int MAX_DECRYPT_BLOCK = 256;/*** 随机生成密钥对(包含公钥和私钥)*/public static KeyPair generateKeyPair() throws Exception {// 获取指定算法的密钥对生成器KeyPairGenerator gen = KeyPairGenerator.getInstance(KEY_ALGORITHM);// 初始化密钥对生成器(指定密钥长度, 使用默认的安全随机数源)gen.initialize(KEY_SIZE);// 随机生成一对密钥(包含公钥和私钥)return gen.generateKeyPair();}/*** 将 公钥/私钥 编码后以 Base64 的格式保存到指定文件*/public static void saveKeyForEncodedBase64(Key key, File keyFile) throws IOException {// 获取密钥编码后的格式byte[] encBytes = key.getEncoded();// 转换为 Base64 文本String encBase64 = Base64Utils.encodeToString(encBytes);// 保存到文件IOUtils.write(encBase64, new FileWriter(keyFile));}/*** RSA公钥加密** @param str       加密字符串* @param publicKey 公钥* @return 密文* @throws Exception 加密过程中的异常信息*/public static String encrypt(String str, String publicKey) throws Exception {//base64编码的公钥byte[] decoded = Base64Utils.decodeFromString(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance(KEY_ALGORITHM).generatePublic(new X509EncodedKeySpec(decoded));//RSA加密String outStr = Base64Utils.encodeToString(cipherEncrypt(str, pubKey));return outStr;}private static byte[] cipherEncrypt(String str, RSAPublicKey pubKey) throws Exception {byte[] srcBytes = str.getBytes("UTF-8");Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, pubKey);return cipherDoFinal(cipher,srcBytes,MAX_ENCRYPT_BLOCK);}/*** RSA私钥解密** @param str        加密字符串* @param privateKey 私钥* @return 铭文* @throws Exception 解密过程中的异常信息*/public static String decrypt(String str, String privateKey) throws Exception {//64位解码加密后的字符串byte[] inputByte = Base64Utils.decode(str.getBytes("UTF-8"));//base64编码的私钥byte[] decoded = Base64Utils.decodeFromString(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance(KEY_ALGORITHM).generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA分段解密String outStr = new String(cipherDecrypt(inputByte, priKey));return outStr;}/*** 分段解密** @param inputByte* @param priKey* @return*/private static byte[] cipherDecrypt(byte[] inputByte, RSAPrivateKey priKey) throws Exception {Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, priKey);return cipherDoFinal(cipher,inputByte,MAX_DECRYPT_BLOCK);}/*** 分段大小** @param cipher* @param srcBytes* @return* @throws Exception*/private static byte[] cipherDoFinal(Cipher cipher, byte[] srcBytes,int segment)throws Exception {ByteArrayOutputStream out = new ByteArrayOutputStream();int inputLen = srcBytes.length;int offSet = 0;byte[] cache;int i = 0;// 对数据分段解密while (inputLen - offSet > 0) {if (inputLen - offSet > segment) {cache = cipher.doFinal(srcBytes, offSet, segment);} else {cache = cipher.doFinal(srcBytes, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * segment;}byte[] data = out.toByteArray();out.close();return data;}
}

超长加密测试

/*** 测试加解密*/@Testpublic void encryptAndDecrypt() throws Exception {String pubKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqtu2aVZv7xG0Ti2JxvJojR2l9yF+w9ptIYGLAoTVISzQ80V43Otxx769idFyLRDDaxcIMFMmBX2IKhQjBecUMxPuo1nKJq6HEVfTKXaWezJgedyY+HfmkoVBZ6f0FEWUXwQlLKMazQ7T1Uu5nYD5RqYm+UDW70kEPcMz+S5RJ2URBTXHtJx4dgnfY+jWD77o1Rag4Rai6/N8qXVnDhx5LAmxT+efmnJ3Uw74yJqJMmRaHlwOoERm7kIiS6w084Fi4ttFk+HlRDqo5/tRL00BmNOh4pbjoln+8hwgqzwQkpAwZp2Y2S0OelCIsl07LqnY+XIMZVpEfq4K8223skWw1wIDAQAB";String priKey = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCq27ZpVm/vEbROLYnG8miNHaX3IX7D2m0hgYsChNUhLNDzRXjc63HHvr2J0XItEMNrFwgwUyYFfYgqFCMF5xQzE+6jWcomrocRV9MpdpZ7MmB53Jj4d+aShUFnp/QURZRfBCUsoxrNDtPVS7mdgPlGpib5QNbvSQQ9wzP5LlEnZREFNce0nHh2Cd9j6NYPvujVFqDhFqLr83ypdWcOHHksCbFP55+acndTDvjImokyZFoeXA6gRGbuQiJLrDTzgWLi20WT4eVEOqjn+1EvTQGY06HiluOiWf7yHCCrPBCSkDBmnZjZLQ56UIiyXTsuqdj5cgxlWkR+rgrzbbeyRbDXAgMBAAECggEBAJ3WBnbdEN5rHoOx8btFqGvkXbMk0DQhjfsL7tzO1QymmAiDvxlmr190xyePwsf62mwNhNUPmuorgyRMIeaMB87/tM5WXjbJt6C/3yRIls8MRK+OqAmwyeHFFByrvQEVHfGApM7Nhi60aeB66eekg6NOTmaoDWZTr4VW1KZ2sSWP3/XG1m+ursijpVBJcDJLClAoY32HmQ0IkwBqt2yI03esI+Y/fgFKUwM9XWQo0NPfCncaxu7cpnIi7wccs0So00VmvsFua/HcryhjkCgEaZi9nZgGMZbRIDPn6Rh/xJ3uS5tHFMNqkF8Xd67zIuneBWFG7Au4x/fcW3/Y40LnBAECgYEA/p+MAiXK2o4WMH7apggHXLTQsJCRvblkj/Qo5fV2EXdlAS+hvrV8+C7pEufI0r5kLB/0LDwB4cZFk+xK4XPB7xUgJKoO80NxXCvYIFgXAivu69EBJoV3o2CRqsoK4CGaykWTwKnNCkrD6hGFYVJLHBGe/K3alAL9lfuFdzj0tdcCgYEAq8g3iv3LY/qY/b00AUgEsGJlISDZ6ROZWhYHzypbmFKNjTbUh3EoHlyhXdmwad9lW2gr5ixlIydjg7MhYbNvr9JSsXM+iYIH8/DjiHkmg8WGhDMb72Bo65GkUUsPl/JuMycF50L9UyQkPaabej4PiI03LXCxnKyeqGK9+rjRfQECgYAsrvkWA2XW9upj9k8OpggMt9qLscMxxVAlhxaKTIo8xHQgQiijXBwjPbA/VhfDDBBuQelKvfkikvXw4J2/dN4Kw+1RIdrfy+0f3L3f5zWadvVFwvbtuKxnKnJFw5EnBh6w8obcX7AQ50/8SrjafGOb+GerNiNOqDuyT2J7qq4fHwKBgQCJMNnLE24AZv8Qhq6l51J3W93QW2AtGQ38OGP8O6PzPtr10Lhjgye7N9dYEKcnptZX7hZBOWt8a9S6NbGPSbMFBEAuoA9t2n9nfxb4w2jTDEmmAvtobeLdX++PTRcjDuaby6qXS5TtdYvMAOdi9XWKZN2QWNRAgEwlxtZbCoekAQKBgQDy+ZlS4iM36LzN5BWPncXRmnGUNnDsSoWpP7yXjOuDpKFMF4cZi+0jDwyHxhSTTg24JOcZDZdRmkvQtF2cgC2QCN9twqLM79+VlGV/KABX0xebZdz6DrlWDwk7jem6b3zCh1XwuzHAvTPthIgGUGBPZjHQgcwoozXZ/TXY0fAlSg==";String text = "asdasdasda";for (; text.length() < 200; text += text) {}String encodeStr = RsaAssistant.encrypt(text, pubKey);LogAssistant.info("解密后:{}", RsaAssistant.decrypt(encodeStr, priKey));}

在这里插入图片描述

REFERENCES

  • RSA加密与解密(Java实现)

  • RSA加密文本过长

  • rsa加解密的内容超长的问题解决

  • Java RSA分段加密

  • RSA详解(Java实现)

  • RSA算法原理(一)

  • RSA算法原理(二)

  • 带你彻底理解RSA算法原理


在这里插入图片描述
在这里插入图片描述

这篇关于RSA 敏感数据加解密方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203866

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,

家庭和学生用户笔记本电脑配置方案

2.6.1  家庭和学生用户笔记本电脑配置方案   2.6.1  家庭和学生用户笔记本电脑配置方案   普通家庭用户、学生用户主要用于上网、娱乐、学习等,这类用户要求笔记本电脑的各方面 功能比较均衡。在选购此类笔记本电脑时,主要考虑外观设计方面要比较时尚,而且性能上也要 够强,一些大型复杂的软件以及目前的主流游戏都要能够流畅地运行才行。   对于CPU方面,可以考虑目前主流的第二

【信创建设】信息系统信创建设整体技方案(word原件完整版)

信创,即“信息技术应用创新”。我国自主信息产业聚焦信息技术应用创新,旨在通过对IT硬件、软件等各个环节的重构,基于我国自有IT底层架构和标准,形成自有开放生态,从根本上解决本质安全问题,实现信息技术可掌控、可研究、可发展、可生产。信创发展是一项国家战略,也是当今形势下国家经济发展的新功能。信创产业发展已经成为各行各业数字化转型、提升产业链发展的关键。 软件全套资料部分文档清单: 工作安排任