非对称加密算法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));
非对称加密算法RSA使用注意事项的更多相关文章
- Java进阶(七)Java加密技术之非对称加密算法RSA
Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...
- 非对称加密算法-RSA算法
一.概述 1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现 2.java6支持RSA算法 3.RSA算法可以用于数据加密和数字签名 4.RSA算法相对于DES/AES等对 ...
- JAVA 非对称加密算法RSA
非对称加密算法 RSA过程 : 以甲乙双方为例 1.初始化密钥 构建密钥对,生成公钥.私钥保存到keymap中 KeyPairGenerator ---> KeyPair --> RSAP ...
- Java加密技术(四)非对称加密算法RSA
RSA 这样的算法1978年就出现了.它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作.也非常流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir ...
- 非对称加密算法RSA 学习
非对称加密算法RSA 学习 RSA加密算法是一种非对称加密算法.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Ad ...
- 非对称加密算法-RSA
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与D ...
- 信息加密之非对称加密算法RSA
前面为大家已经总结了,基于密钥交换的DH算法,现在就为大家再介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1.公钥加密,私钥解密:2.私钥加密,公钥解密.下面就为大家分析一下实现代码, ...
- 第十二章 非对称加密算法-RSA
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与D ...
- openssl 非对称加密算法RSA命令详解
1.非对称加密算法概述 非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下: 1.加密密钥和解密密钥不同 2.密钥对中的一个密钥可以公开 3.根据公开密钥很 ...
随机推荐
- hdu 4747【线段树-成段更新】.cpp
题意: 给出一个有n个数的数列,并定义mex(l, r)表示数列中第l个元素到第r个元素中第一个没有出现的最小非负整数. 求出这个数列中所有mex的值. 思路: 可以看出对于一个数列,mex(r, r ...
- J2EE互联网产品打造
CSDN的各位技术朋友们,你们好: 我司最近正在研发一套J2EE的互联网产品,前期功能设计例如以下: 1.权限管理 2.菜单管理 3.系统设置 4.页面管理[主要做静态化] 5.任务管理[数据同步以及 ...
- MySQLdb 连接Mysql 数据库出错解决
#coding=utf-8 import MySQLdb if __name__ == "__main__": db = MySQLdb.connect(host=<sp ...
- JAVA取整以及四舍五入
JAVA取整以及四舍五入 import java.math.BigDecimal; //引入这个包 public class Test { public static void main(String ...
- JAVA 根据经纬度算出附近的正方形的四个角的经纬度
/** * * @param longitude 经度 * @param latitude 纬度 * @param distance 范围(米) * @return */ public static ...
- iPhone 6 首发无大陆,DevStore要去香港吗?
iPhone 6 正式公布,微博已经被刷屏.iPhone 6 的各种信息都已经明了,先不说什么配置,什么设计,就说一点--iPhone6 首发地方是没有中国大陆的.这让我想起来最近參加的源代码大赛,这 ...
- windows phone 7 通过Post提交URL到服务器,从服务器获取数据(比如登陆时候使用)
原文:windows phone 7 通过Post提交URL到服务器,从服务器获取数据(比如登陆时候使用) HttpWebRequest myRequest = (HttpWebRequest)Web ...
- 将ACCESS数据库迁移到SQLSERVER数据库
原文:将ACCESS数据库迁移到SQLSERVER数据库 将ACCESS数据库迁移到SQLSERVER数据库 ACCESS2000文件 用ACCESS2007打开,并迁移到SQLSERVER2005里 ...
- 深入了解回调函数Java
打回来.我第一次看到Java编程思想,后来Observer模式也适用于一个回调函数的想法.但是,一直没有重视,在处于劣势的最终面试,越来越明白为什么那么多人说Java编程思想,这本书应该是一遍又一遍, ...
- python可变交换性能优化
离许多新的压力python性能优化见交换两个变量值可以使用 a,b = b,a 这样能够提高性能 >>> from timeit import Timer >>> ...