【问题标题】:RSA encryption by supplying modulus and exponent通过提供模数和指数进行 RSA 加密
【发布时间】:2012-04-08 00:25:05
【问题描述】:

我正在创建一个 C# Winforms 应用程序,它通过 HTTPS 将数据发布到服务器。

登录机制应该是这样的:

  1. 我将用户名发送到服务器,它以 rsa-modulus 和 rsa-exponent 响应

  2. 我使用这些给定的参数对密码进行加密,并将用户名+密码发送到服务器进行身份验证

我尝试了RSACryptoServiceProvider 类,但我找不到示例或关于我们如何使用给定的模数和指数进行加密? 的任何内容。

我认为在不指定任何值的情况下,它会执行默认加密参数..

所以如果有人以前这样做过,他们能给我一些提示吗?谢谢

更新:根据 Carsten Konig 先生的建议,.我曾尝试使用 RSAParameters 和 RSA.ImportParameters 来完成此操作,但它返回带有加密异常的“BAD DATA”错误。我的代码如下。

我也试过RSA.FromXmlString(mykey); (其中mykey 包含一个带有模数和exp 的xml 字符串),但我也得到一个带有密码异常的“BAD DATA”错误......有人知道吗?或者如果它是一些微软的错误,任何人都可以建议一些其他像样的库来轻松地做到这一点?

RSAParameters rsaparam = new RSAParameters(); 
rsaparam.Modulus = modbytes; 
rsaparam.Exponent = expbytes; 
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider() ; 
RSA.ImportParameters(rsaparam); 
byte[] encryptedData = RSA.Encrypt(dataToEncrypt, false)

【问题讨论】:

    标签: c# winforms encryption rsa


    【解决方案1】:

    您可以使用RSACryptoServiceProvider.Encrypt 方法来做到这一点。您还需要使用RSACryptoServiceProvider.ImportParameters 方法并将RSAParameters 结构传递给它(这是您设置指数、模数等的地方)。

    请查看 RSAParameters 链接中的文档 - 它非常详细地记录了您必须为什么结构字段传递什么参数 - 如果您现在使用算法应该没问题。

    编辑:这是直接来自MSDN-site的示例:

    class RSACSPSample
    {
    
        static void Main()
        {
            try
            {       //initialze the byte arrays to the public key information.
                byte[] PublicKey = {214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56,
                                       74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222,
                                       207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175,
                                       108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194,
                                       240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139,
                                       168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171,
                                       38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93,
                                       106,99,179,68,175,211,164,116,64,148,226,254,172,147};
    
                byte[] Exponent = {1,0,1};
    
                //Values to store encrypted symmetric keys.
                byte[] EncryptedSymmetricKey;
                byte[] EncryptedSymmetricIV;
    
                //Create a new instance of RSACryptoServiceProvider.
                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
    
                //Create a new instance of RSAParameters.
                RSAParameters RSAKeyInfo = new RSAParameters();
    
                //Set RSAKeyInfo to the public key values. 
                RSAKeyInfo.Modulus = PublicKey;
                RSAKeyInfo.Exponent = Exponent;
    
                //Import key parameters into RSA.
                RSA.ImportParameters(RSAKeyInfo);
    
                //Create a new instance of the RijndaelManaged class.
                RijndaelManaged RM = new RijndaelManaged();
    
                //Encrypt the symmetric key and IV.
                EncryptedSymmetricKey = RSA.Encrypt(RM.Key, false);
                EncryptedSymmetricIV = RSA.Encrypt(RM.IV, false);
    
                Console.WriteLine("RijndaelManaged Key and IV have been encrypted with RSACryptoServiceProvider."); 
    
            }
            //Catch and display a CryptographicException  
            //to the console.
            catch(CryptographicException e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
    

    请注意,只有 key/iv 被加密 - 不是任意字节 - 这些字节的长度也很重要!

    MSDN 中描述了允许的长度,具体取决于操作系统!

    【讨论】:

    • 嗨,carsten konig,谢谢你的回复..我已经试过了,但是它返回一个“BAD DATA”错误并出现加密异常..知道,我可能做错了什么?我在下面添加了代码` RSAParameters rsaparam = new RSAParameters(); rsaparam.Modulus = modbytes; rsaparam.Exponent = expbytes; RSACryptoServiceProvider RSA = new RSACryptoServiceProvider() ; RSA.ImportParameters(rsaparam); byte[] encryptedData = RSA.Encrypt(dataToEncrypt, false);'
    • 我也试过 RSA.FromXmlString(mykey); (其中 mykey 包含一个带有模数和 exp 的 xml 字符串)但在那我也得到了一个带有加密异常的“BAD DATA”错误......任何人知道吗?或者如果它是一些微软的错误,任何人都可以建议一些其他像样的库来轻松地做到这一点?
    • 很难说 - 内部异常中有什么东西吗?也许你弄错了 key-lenth ... 想一想 - 你知道要加密的数据长度必须有一定的长度吗?
    • 嗨,先生。 carten konig,不,内部异常没有任何东西..我有点放弃了..看起来以前没有人真正尝试过这个。感谢您的所有提示和帮助。
    • 请注意,如果您的 Modulus 和 Exponent 来自 Java,则需要反转数组并在反转之前从中删除 0x00 填充
    【解决方案2】:

    如果您使用 RSACryptoServiceProvider.ToXmlString 导出服务器发送的模数和指数,则需要使用 Convert.FromBase64String。

        public RSAParameters SetPublicKey(string modulus, string exponent)
        {
            RSAParameters result = new RSAParameters();
            result.Modulus = Convert.FromBase64String(modulus);
            result.Exponent = Convert.FromBase64String(exponent);
    
            return result;
        }
    

    【讨论】:

      【解决方案3】:

      另外一个对我非常有用的提示:

      在这一行,

      //Set RSAKeyInfo to the public key values. 
      SAKeyInfo.Modulus = PublicKey;
      

      PublicKey 也可以是直接、直接的字节数组,您可以从 X509 证书的“Public Key”字段(直接)获取。

      【讨论】:

        猜你喜欢
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 1970-01-01
        • 2017-11-03
        • 2015-10-13
        • 1970-01-01
        相关资源
        最近更新 更多