我们都知道RSA算法是,公钥和私钥是一对非对称密钥,用公钥加密的信息可用私钥解开,如文件加密,用私钥加密的信息可以用公钥解开,如数字签名。
但是在C#的RSACryptoServiceProvider 类中,我发现用公钥加密的信息私钥可以解开,但用私钥加密的信息用公钥解时会产生异常。实现签名时,必须用导入私钥的RSACryptoServiceProvider对象的SignData()方法实现签名,并用导入相应公钥(私钥也可以)的RSACryptoServiceProvider对象的VerifyData()实现比较.
我仔细研究过RSA ,公钥和私钥是可以互逆的,但为什么在RSACryptoServiceProvider 类中无法实现。

解决方案 »

  1.   

    关于RSA算法,在下的笔记:RSA 秘钥的产生
    选取两个大素数(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 解密结束从上面的公式可以看出,由公钥加密的秘文可以用私钥解密,而私钥加密的秘文也可以用公钥解密。
      

  2.   

    老贴也回
    RSA算法是互逆的。也就是说公钥和私钥可以互换角色。
    但是RSA加密标准则不是这样,只能用公钥加密,私钥解密。关于这个,应该了解下RSA加密标准,它是在RSA算法上实现的。因此才需要密钥交换,通讯的时候使用对方的公钥加密,而加密信息只有对方才能解密,你不能分发私钥,因为私钥信息包含公钥信息。而签名是使用私钥签名,公钥验证,因为私钥只有你本人知道,因此验证的用户可以认为信息是你发送的。
    RSA主要目的不是用于加密,因为其速度慢,加密长度有限制。它主要用于身份验证。在网上查找ssl协议模型的资料,会有更清晰的认识。