使用Exponent,Modulus和Base作为参数的c#中的RSA加密

时间:2010-10-15 10:38:41

标签: c# encryption cryptography

我有一个专有应用程序,它使用扩展来处理加密。为了加密字符串,我将其作为参数提供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);

    }
} 

当我使用专有应用程序加密数据,然后尝试使用上面的代码时 - 生成的加密数据是不同的。

我不知道如何继续。

编辑;它每次运行时都会返回一个不同的字符串。使用相同的输入字符串。

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,GregS是正确的。程序可以通过很多方式对密钥和密文进行编码。遗憾的是,如果您没有扩展程序使用的协议或文件格式规范,则必须对其进行逆向工程。

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

编辑:这意味着您加密明文并将结果与​​模块输出进行比较的方法将无效。相反,一旦您认为您已找到扩展模块正在吐出的RSA输出,请尝试解密。

答案 1 :(得分:0)

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

  

6E006F006E006F006E006F006D006F006E006F006D006E006F006D0066006F006F006E006F006E006D006F00

和指数:

  

6200

我认为他们错了,因为Unicode编码的特殊性。您可能只是输入错误并希望使用System.Text.Encoding。 UTF8 .GetBytes。

模数的结果会好得多:

  

6E6F6E6F6E6F6D6F6E6F6D6E6F6D666F6F6E6F6E6D6F

但一般情况下我建议使用Base64进行密钥或关键部件传输而不是UTF-8字符串。

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

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

也许这个链接对您来说也很有趣All About RSAParameters