winforms 提供模数和指数的RSA加密

sg24os4d  于 2023-03-19  发布在  其他
关注(0)|答案(4)|浏览(100)

我正在创建一个C# Winforms应用程序,它通过HTTPS将数据发送到服务器。
登录机制应该是这样的:
1.我将用户名发送到服务器,服务器返回rsa模数和rsa指数
1.我使用这些给定的参数加密密码,并将用户名+密码发送到服务器进行身份验证
我试过RSACryptoServiceProvider类,但我找不到示例或上的任何内容,我们如何使用给定的模数和指数进行加密?
我认为,如果不指定任何值,它将执行默认加密参数。
所以如果有人曾经这样做过,他们能给予我一些提示吗?谢谢

UPDATE:根据Carsten Konig先生的建议,我尝试使用RSAParameters和RSA.ImportParameters执行此操作,但它返回一个“BAD DATA”错误,并伴有加密异常。我的代码如下所示。

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

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

pb3skfrl1#

你可以使用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);
        }
    }
}

请注意,只有密钥/iv会被加密,而不是任意字节,这些字节的长度也很重要!
MSDN中描述了允许的长度,具体取决于操作系统!

nnt7mjpx

nnt7mjpx2#

如果使用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;
    }
rjzwgtxy

rjzwgtxy3#

还有一个对我非常有用的提示:
在这条线上,

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

PublicKey也可以是一个直接的字节数组,您可以从X509证书的“公钥”字段(直接)获得。

13z8s7eq

13z8s7eq4#

我有代码,我正在加密指数和模数,但未能解密它这里是我的加密代码。任何人可以帮助解密吗?我已经尝试var plaintext = csp.Decrypt(cipherText, false);,但不工作

string EXP = "AQAB";
        string MODULUS = "zf4LgceVPvjMLz/pp8exH58AeBrhjLe0k4FRmd59I0k4sH6oug6Z9RfY4FvEFcssBwH1cmWF5/Zen8xbRVRyUnzer6b6cKmlzHFYf0LlbovvYMkW5pdhRcTHK2ijByGtmVgU/CEKEQTy3elpU7ZsHE8D6T1M7L2gmGAxvgldUMRu4l8BPuRyht1a9dA9b6005atpdlkCSc3emXSfyBOBwNE0UicVTVncn9SBjP7bTBGgOKshYnYsqh4BD0I7AU3xdoAsZVWudECX/zVa7uUOk1ooVYjMEyfBngrEDXrmIkAlVruUuj/eWiYwT2vXqByQgDfDvat5IS4i3ywiHAWXUQ==";

        RSACryptoServiceProvider csp = new RSACryptoServiceProvider(2048);
        csp.FromXmlString("<RSAKeyValue><Exponent>" + EXP + "</Exponent><Modulus>" + MODULUS + "</Modulus></RSAKeyValue>");

        // encrypting a string for testing purposes
        byte[] plainText = Encoding.ASCII.GetBytes("Hello from .NET");
        byte[] cipherText = csp.Encrypt(plainText, false);

        Console.WriteLine("Encrypted: " + Convert.ToBase64String(cipherText));
        var plaintext = csp.Decrypt(cipherText, false);

相关问题