非对称加密算法RSA使用注意事项

简介: 原文: 非对称加密算法RSA使用注意事项 第一个问题,也是最重要的一个——RSA无法对超过117字节的数据进行加密!切记!其实也勿需要求对更大数据的加密,虽然网上已经有相关解决方案,比如BigInteger项目。
原文: 非对称加密算法RSA使用注意事项

第一个问题,也是最重要的一个——RSA无法对超过117字节的数据进行加密!切记!其实也勿需要求对更大数据的加密,虽然网上已经有相关解决方案,比如BigInteger项目。但这点确实需要注意,如果对大于117字节的数据加密就会抛异常出来,说法还有点莫名其妙。考虑下RSA的主要用途就可以理解了,一般我们使用RSA的主要用途是进行数字签名,另外就是对“对称加密”算法的KEY和IV向量进行加密;

 

第二个问题,假设要对一个文本文件(比如xml文件)中的某些数据进行加密,加密后再写入文本文件怎么办呢?(如果将加密后的byte数组直接以流的形式写入文件,则无此问题)这就涉及到一个byte[]到String的转换问题,有的人马上会说,这简单嘛,用Encoding.Default.GetString呗,果真如此的话,也就没有本问题了!如果你使用Encoding.Default.GetString保存加密结果到文件中,再解密的话你就会遇到下面这个异常:

未处理 System.Security.Cryptography.CryptographicException Message="不正确的数据。/r/n" Source="mscorlib" StackTrace: 在 System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr) 在 System.Security.Cryptography.Utils._DecryptKey(SafeKeyHandle hPubKey, Byte[] key, Int32 dwFlags) 在 System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP) 在 crse3363ae_lab01.Program.Decrypt() 位置 D:/Training/dotNet Framework 2.0/示例程序/crse3363ae_lab01/crse3363ae_lab01/crse3363ae_lab01/Program.cs:行号 286 在 crse3363ae_lab01.Program.Main() 位置 D:/Training/dotNet Framework 2.0/示例程序/crse3363ae_lab01/crse3363ae_lab01/crse3363ae_lab01/Program.cs:行号 56 在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart() InnerException:   

原因是因为使用Encoding.Default.GetString()对加密后的byte[](为了后文方便,此处赋予其一个变量名right)进行处理后,再写入文本文件,解密的时候再使用Encoding.Default.GetBytes()对将加密内容(String类型)转换得到byte[]数组,这个时候得到的byte[]数组(变量名:wrong)已经不是前文的那个right变量来,内容和大小都不同!你拿一个错误的字符串去解密当然会报“不正确的数据”了,确实不正确嘛!

呵呵!下面说一下如何解决这个问题(下面只提供问题相关的代码):

1)加密

byte[] value = rsa.Encrypt(Encoding.Default.GetBytes(temp), false); //用公钥加密 var stringBuilder = new StringBuilder(); //声明一个变量,存放byte[]转换后的字符 for (int i = 0; i < value.Length; i++) { stringBuilder.Append(value[i].ToString("x2")); //x2是转换为两位的16进制数,转换后的长度为加密长度的两倍:256位 } SaveToFile("1.dat", stringBuilder.ToString()); //写入文件

2)解密

byte[] tmp = GetBytes(ReadFromFile("1.dat")); //GetBytes函数后面提供 byte[] value = rsa.Decrypt(tmp, false); //使用私钥正常解密,再也没有烦人的数据不正确错误了 Console.WriteLine(Encoding.Default.GetString(value));//显示解密后的数据 GetBytes函数如下: private static byte[] GetBytes(string hexStr) { var rtnByteArray = new byte[hexStr.Length/2];//建立一个byte数组 int j = 0; for (int i = 0; i < hexStr.Length; i = i + 2) { string tmp = hexStr.Substring(i, 2);//每读取两位然后转换为十进制 rtnByteArray[j++] = Convert.ToByte(Convert.ToInt32(tmp, 16));//转换为byte类型 } return rtnByteArray; }

好了,现在一切OK!!顺便说一下,RSA无法对超过128 BYTE的数据进行解密。

 

后记,今天突然想到可以Base64编码,看来前面绕路了,下面我们使用Base64编码再来实现一次,非常简单:

1)加密

byte[] value = rsa.Encrypt(Encoding.Default.GetBytes(kvp.Value), false); enPatient.Add(Convert.ToBase64String(value));

 

2)解密

byte[] value = rsa.Decrypt(Convert.FromBase64String(kvp.Value), false); dePatient.Add(Encoding.Default.GetString(value));

目录
相关文章
|
5月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
201 0
|
6月前
|
算法 数据安全/隐私保护
基于混沌加密的遥感图像加密算法matlab仿真
本项目实现了一种基于混沌加密的遥感图像加密算法MATLAB仿真(测试版本:MATLAB2022A)。通过Logistic映射与Baker映射生成混沌序列,对遥感图像进行加密和解密处理。程序分析了加解密后图像的直方图、像素相关性、信息熵及解密图像质量等指标。结果显示,加密图像具有良好的随机性和安全性,能有效保护遥感图像中的敏感信息。该算法适用于军事、环境监测等领域,具备加密速度快、密钥空间大、安全性高的特点。
|
存储 安全 数据安全/隐私保护
打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
【9月更文挑战第9天】随着数字化时代的到来,信息安全问题日益凸显。本文将介绍如何使用Python结合AES与RSA两种加密算法,构建强大的加密工具。AES以其高效性和强安全性著称,适用于大量数据的快速加密;RSA作为非对称加密算法,在加密小量数据及实现数字签名方面表现卓越。通过整合两者,可以构建既安全又灵活的加密系统。首先,需要安装pycryptodome库。接着,实现AES加密与解密功能,最后利用RSA加密AES密钥,确保其安全传输。这种设计不仅提高了数据传输效率,还增强了密钥交换的安全性,为敏感数据提供坚实保护。
497 43
|
安全 算法 网络安全
浅谈非对称加密(RSA)
浅谈非对称加密(RSA)
570 0
|
10月前
|
弹性计算 算法 Linux
使用SM4算法加密LUKS格式磁盘
本文介绍了在Anolis 8操作系统使用cryptsetup对磁盘进行分区、加密和挂载的过程。采用SM4加密算法。具体步骤包括:初始化加密卷、解锁加密分区、格式化并挂载设备。最后,展示了如何取消挂载并关闭加密卷以确保数据安全。整个过程确保了磁盘数据的安全性和隐私保护。
788 2
使用SM4算法加密LUKS格式磁盘
|
12月前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
326 12
|
算法 安全 Go
RSA加密算法详解与Python和Go实现
RSA加密算法详解与Python和Go实现
1335 1
|
算法 安全 网络安全
使用 Python 实现 RSA 加密
使用 Python 实现 RSA 加密
445 2
|
存储 安全 算法
RSA在手,安全我有!Python加密解密技术,让你的数据密码坚不可摧
【9月更文挑战第11天】在数字化时代,信息安全至关重要。传统的加密方法已难以应对日益复杂的网络攻击。RSA加密算法凭借其强大的安全性和广泛的应用场景,成为保护敏感数据的首选。本文介绍RSA的基本原理及在Python中的实现方法,并探讨其优势与挑战。通过使用PyCryptodome库,我们展示了RSA加密解密的完整流程,帮助读者理解如何利用RSA为数据提供安全保障。
395 5

热门文章

最新文章