我有一个专有应用程序,它使用扩展来处理加密。为了加密字符串,我将其作为参数提供Exponent,Modulus,Base和string。它返回加密的字符串。
我需要能够在与专有应用程序对话的c#应用程序中复制此功能。我不确定从哪里开始 - 并且非常感谢你能给予的任何帮助。
这就是我现在所拥有的;
public class Cryptography
{
public static RSACryptoServiceProvider rsa;
public static void AssignParameter()
{
const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "SpiderContainer";
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
//cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
rsa = new RSACryptoServiceProvider(cspParams);
}
public static string Sencrypt(string input)
{
RSAParameters parameters = new RSAParameters();
parameters.Modulus = System.Text.Encoding.Unicode.GetBytes("nononomonomnomfoononmo");
parameters.Exponent = System.Text.Encoding.Unicode.GetBytes("b");
rsa.ImportParameters(parameters);
byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(input);
byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
//return enc.GetString(cipherbytes);
return Convert.ToBase64String(cipherbytes);
}
}
当我使用专有应用程序加密数据,然后尝试使用上面的代码时 - 生成的加密数据是不同的。
我不知道如何继续。
编辑;它每次运行时都会返回一个不同的字符串。使用相同的输入字符串。
答案 0 :(得分:1)
如果我理解你的问题,GregS是正确的。程序可以通过很多方式对密钥和密文进行编码。遗憾的是,如果您没有扩展程序使用的协议或文件格式规范,则必须对其进行逆向工程。
您评论了程序每次运行时都返回不同的字符串这一事实。这是RSA的属性,实际上是任何公钥加密原语。确定性算法(即,在给定相同输入的情况下始终返回相同输出的非随机算法)不能用作公钥加密原语,因为它们容易受到选择明文攻击。
编辑:这意味着您加密明文并将结果与模块输出进行比较的方法将无效。相反,一旦您认为您已找到扩展模块正在吐出的RSA输出,请尝试解密。
答案 1 :(得分:0)
你的参数初始化有点奇怪。你确定你得到有效的结果作为模数(低于字节表示)?
6E006F006E006F006E006F006D006F006E006F006D006E006F006D0066006F006F006E006F006E006D006F00
和指数:
6200
我认为他们错了,因为Unicode编码的特殊性。您可能只是输入错误并希望使用System.Text.Encoding。 UTF8 .GetBytes。
模数的结果会好得多:
6E6F6E6F6E6F6D6F6E6F6D6E6F6D666F6F6E6F6E6D6F
但一般情况下我建议使用Base64进行密钥或关键部件传输而不是UTF-8字符串。
此外,您不指定使用的密钥大小。默认情况下是1024吗?
所以,我建议尝试使用UTF8并检查密钥大小。希望它会有所帮助。
也许这个链接对您来说也很有趣All About RSAParameters