C# 提供模和指数的RSA加密
我正在创建一个C#Winforms应用程序,它通过HTTPS将数据发布到服务器 登录机制应该是这样的:C# 提供模和指数的RSA加密,c#,winforms,encryption,rsa,C#,Winforms,Encryption,Rsa,我正在创建一个C#Winforms应用程序,它通过HTTPS将数据发布到服务器 登录机制应该是这样的: 我将用户名发送到服务器,服务器用rsa模数和rsa指数进行响应 我使用这些给定参数加密密码,并将username+password发送到服务器进行身份验证 我尝试了RSACryptoServiceProvider类,但找不到示例或如何使用给定的模和指数进行加密?上的任何内容 我认为在不指定任何值的情况下,它会执行默认的加密参数 所以,如果有人曾经这样做过,他们能给我一些提示吗?谢谢 更新:根据
RSACryptoServiceProvider
类,但找不到示例或如何使用给定的模和指数进行加密?上的任何内容
我认为在不指定任何值的情况下,它会执行默认的加密参数
所以,如果有人曾经这样做过,他们能给我一些提示吗?谢谢
更新:根据卡斯滕·科尼格先生的建议。我曾尝试使用rsapameters和RSA.ImportParameters
执行此操作,但它返回一个带有加密异常的“坏数据”错误。我的代码如下
我还尝试了RSA.FromXmlString(mykey);(其中mykey
包含一个带模数和exp的xml字符串),但我也得到了一个带有加密异常的“坏数据”错误。。。有人知道吗?或者,如果这是微软的错误,有人能建议其他合适的库来轻松地做到这一点吗
RSAParameters rsaparam = new RSAParameters();
rsaparam.Modulus = modbytes;
rsaparam.Exponent = expbytes;
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider() ;
RSA.ImportParameters(rsaparam);
byte[] encryptedData = RSA.Encrypt(dataToEncrypt, false)
您可以通过使用该方法来实现这一点。您还需要使用该方法并向其传递一个结构(这是您设置指数、模数等的地方) 请看一看RSA参数链接中的文档,它很好地记录了对于什么结构字段必须传递什么参数,如果您现在使用该算法,应该不会有问题 编辑:以下是直接来自以下内容的示例: 请注意,只有key/iv被加密-而不是任意字节-这些字节的长度也很重要
MSDN中描述了允许的长度,具体取决于操作系统 另外一个对我非常有用的提示: 在这方面,
//Set RSAKeyInfo to the public key values.
SAKeyInfo.Modulus = PublicKey;
公钥也可以是一个直接、直接的字节数组,可以从X509证书的“公钥”字段(直接)获取。如果使用rsacryptServiceProvider.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;
}
嗨,卡斯滕·科尼格,谢谢你的回复。。我已经尝试过了,但它返回了一个带有加密异常的“坏数据”错误。。知道我做错了什么吗?我在下面添加了代码`rsapameters rsaparm=new rsapameters();rsparam.modules=modbytes;rsparam.Exponent=expbytes;RSACryptoServiceProvider RSA=新的RSACryptoServiceProvider();RSA.输入参数(rsaparam);字节[]encryptedData=RSA.Encrypt(dataToEncrypt,false);'我还尝试了RSA.FromXmlString(mykey);(其中mykey包含一个带模数和exp的xml字符串),但在这其中,我也得到了一个带有加密异常的“坏数据”错误。。。有人知道吗?或者,如果是微软的一些bug,有人能推荐其他合适的库来轻松地做到这一点吗?很难说——内部异常中有什么东西吗?也许你把钥匙的长度弄错了。。。想一想-你知道要加密的数据长度必须有一定的长度吗?嗨,卡斯滕·科尼格先生,没有内部异常。。我有点放弃了。。看起来以前没人试过这个。谢谢你的提示和帮助。不,我以前也做过类似的事情——你检查过要加密的块的长度了吗?
public RSAParameters SetPublicKey(string modulus, string exponent)
{
RSAParameters result = new RSAParameters();
result.Modulus = Convert.FromBase64String(modulus);
result.Exponent = Convert.FromBase64String(exponent);
return result;
}