我们都知道RSA算法是,公钥和私钥是一对非对称密钥,用公钥加密的信息可用私钥解开,如文件加密,用私钥加密的信息可以用公钥解开,如数字签名。
但是在C#的RSACryptoServiceProvider 类中,我发现用公钥加密的信息私钥可以解开,但用私钥加密的信息用公钥解时会产生异常。实现签名时,必须用导入私钥的RSACryptoServiceProvider对象的SignData()方法实现签名,并用导入相应公钥(私钥也可以)的RSACryptoServiceProvider对象的VerifyData()实现比较.
我仔细研究过RSA ,公钥和私钥是可以互逆的,但为什么在RSACryptoServiceProvider 类中无法实现。
但是在C#的RSACryptoServiceProvider 类中,我发现用公钥加密的信息私钥可以解开,但用私钥加密的信息用公钥解时会产生异常。实现签名时,必须用导入私钥的RSACryptoServiceProvider对象的SignData()方法实现签名,并用导入相应公钥(私钥也可以)的RSACryptoServiceProvider对象的VerifyData()实现比较.
我仔细研究过RSA ,公钥和私钥是可以互逆的,但为什么在RSACryptoServiceProvider 类中无法实现。
解决方案 »
- Select * from MAILBODYTXT
- 怎样才能在右击ListView的列标题和右击内容时弹出不同的快捷菜单?
- web services 实现图片上传问题
- C# dll 的问题
- [求助]在C#中怎样完全描述一个对象并可以重新构造正常使用
- ToolBar的显示属性问题
- 如何实现让textBox控件自动向下滚动
- 高散分---关于treeView和数据库绑定的问题
- .net core 读取appsettings.json时中文乱码,Configuration.GetConnectionString
- 每次使用预定义字符串变量是不是对性能更好?
- TransationScope事务不撤消,微软的BUG吗???
- 说了又说——每个人都会遇到的问题——数据库连接优化问题(涉及到设计模式)
选取两个大素数(100~200位),p 和 q
Calculate n = p.q
现在,选择一个秘钥e,使得 e 与(p-1)*(q-1)互质:
gcd(e, (p – 1).(q – 1)) = 1
选取一个秘钥d,使得:
e.d = 1 mod (p – 1).(q – 1)
换句话说
e.d = k.(p – 1).(q – 1) + 1
此后p与q不再有用RSA加密解密
在这里再说一下欧拉定理:
如果a与n互质,则有a^(f(n)) 恒等于 1 mod n。其中f(n)为小于n并且与n互素的数字的个数。
比如f(15)的个数为8,因为有1,2,4,7,8,11,13,14与15互素。
如果n=pq(p与q互质),则有a^(f(n)) = a^((p-1)(q-1)) = 1 mod n对于原文m 秘文c
c = m^e mod n
c^e mod n = (m^d mod n)^e mod n
= (m ^ (de)) mod n
= (m ^(k(p-1)*(q-1)+1)) mod n
= (m ^(k(p-1)(q-1))*m) mod n
= ((m ^ ((p-1)(q-1)))^k * m) mod n
= (1 * m) mod n
= m 解密结束从上面的公式可以看出,由公钥加密的秘文可以用私钥解密,而私钥加密的秘文也可以用公钥解密。
RSA算法是互逆的。也就是说公钥和私钥可以互换角色。
但是RSA加密标准则不是这样,只能用公钥加密,私钥解密。关于这个,应该了解下RSA加密标准,它是在RSA算法上实现的。因此才需要密钥交换,通讯的时候使用对方的公钥加密,而加密信息只有对方才能解密,你不能分发私钥,因为私钥信息包含公钥信息。而签名是使用私钥签名,公钥验证,因为私钥只有你本人知道,因此验证的用户可以认为信息是你发送的。
RSA主要目的不是用于加密,因为其速度慢,加密长度有限制。它主要用于身份验证。在网上查找ssl协议模型的资料,会有更清晰的认识。