我在 CodeProject 上看过一篇文章,其中解释了如何使用 RSA 提供程序进行加密和解密:
虽然 2009 年的旧版本有问题,但 2012 年的新版本(支持 System.Numerics.BigInteger)似乎更可靠。不过,这个版本缺少的是一种使用公钥加密和使用私钥解密的方法。
因此,我自己尝试过,但解密时会出现垃圾。我不熟悉 RSA 提供商,所以我在这里一无所知。很难找到更多关于这应该如何工作的信息。
有谁看到这有什么问题?以下是使用 PUBLIC 密钥的加密:
// Add 4 byte padding to the data, and convert to BigInteger struct
BigInteger numData = GetBig( AddPadding( data ) );
RSAParameters rsaParams = rsa.ExportParameters( false );
//BigInteger D = GetBig( rsaParams.D ); //only for private key
BigInteger Exponent = GetBig( rsaParams.Exponent );
BigInteger Modulus = GetBig( rsaParams.Modulus );
BigInteger encData = BigInteger.ModPow( numData, Exponent, Modulus );
return encData.ToByteArray();
执行此操作时是否使用提供商提供的大“D”?可能不是,因为它是没有“D”的公钥。
然后是对应的(使用 PRIVATE 密钥解密):
BigInteger numEncData = new BigInteger( cipherData );
RSAParameters rsaParams = rsa.ExportParameters( true );
BigInteger D = GetBig( rsaParams.D );
//BigInteger Exponent = GetBig( rsaParams.Exponent );
BigInteger Modulus = GetBig( rsaParams.Modulus );
BigInteger decData = BigInteger.ModPow( numEncData, D, Modulus );
byte[] data = decData.ToByteArray();
byte[] result = new byte[ data.Length - 1 ];
Array.Copy( data, result, result.Length );
result = RemovePadding( result );
Array.Reverse( result );
return result;
我在这里需要“D”还是指数?
显然,我需要加密货币以私人-公共-公共-私人两种方式工作。任何帮助深表感谢!