2010-10-15 84 views
1

我有一个专有的应用程序,使用扩展来处理加密。要加密一个字符串,我将它作为参数提供指数,模数,基数和字符串。它返回加密的字符串。在c#中使用指数,模数和基地作为参数RSA加密

我需要能够在与专有应用程序交谈的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

您需要显示您尝试匹配的扩展的代码。使用“Exponent,Modulus,Base和string”作为参数的加密会留下无限的可能性。对我们来说,尝试猜测是毫无意义的。你的Modulus和Exponent的C#代码有点难以置信。你从哪里弄到那些琴弦? – 2010-10-16 12:05:25

回答

0

你的参数初始化有点奇怪。你确定你得到有效的结果作为模数(低于字节表示)?

6E006F006E006F006E006F006D006F006E006F006D006E006F006D0066006F006F006E006F006E006D006F00

和指数:

我认为他们是错误的,因为Unicode编码的特异性。你可能只是错误并想要使用System.Text.Encoding。 UTF8。GetBytes。

结果为模量会好得多:

6E6F6E6F6E6F6D6F6E6F6D6E6F6D666F6F6E6F6E6D6F

,但总的来说,我建议使用Base64的关键或关键部件转移UTF-8字符串代替。

此外,您不指定使用的密钥大小。默认情况下它是1024吗?

所以,我建议尝试使用UTF8并检查密钥大小。希望它会有所帮助。

也许这个环节也将吸引您All About RSAParameters

+0

不错的尝试,因为它不能是.NET的Unicode编码,但UTF8也不会保存这个。至少,RSA指数不可能是偶数。 – 2010-10-16 12:10:25

+0

是的,它看起来很奇怪(还有Modulus),但我希望作者只是将这些字符串作为示例,而不想显示真实的值。 – 2010-10-16 13:05:55

1

如果我正确理解你的问题,GregS是正确的。程序可以编码密钥和密文的方式有很多种。不幸的是,如果你没有该扩展所使用的协议或文件格式的规格,则必须对其进行反向工程。

您评论过程序每次运行时都会返回一个不同的字符串。这是RSA的一个特性,实际上也是任何公钥加密原语。确定性算法(即在给定相同输入的情况下始终返回相同输出的非随机算法)不能用作公钥加密原语,因为它们易受到选择明文攻击。

编辑:这意味着你的加密明文和比较结果与模块的输出的方法将无法正常工作。相反,一旦您确信已找到扩展模块正在吐出的RSA输出,请尝试对其解密。

相关问题