【问题标题】:C# RSA public Modulus/Exponent? (Bad Data)C# RSA 公共模数/指数? (不良数据)
【发布时间】:2015-10-21 18:55:48
【问题描述】:

我已经尝试过,但我继续收到“错误数据”。如何使用带有公钥的指数/模数的 RSACryptoServiceProvider 解密数据?

public static byte[] Encrypt(byte[] b, byte[] mod, byte[] exp)
{
    CspParameters csp = new CspParameters();
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
    RSACryptoServiceProvider.UseMachineKeyStore = false;

    RSAParameters par = new RSAParameters();
    par.Exponent = exp;
    par.Modulus = mod;
    rsa.ImportParameters(par);

    return rsa.Encrypt(b, false);
}
public static byte[] Decrypt(byte[] b, byte[] pubexp, byte[] mod, byte[] priexp)
{
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    RSACryptoServiceProvider.UseMachineKeyStore = false;
    RSAParameters rp = new RSAParameters();

    rp.Exponent = pubexp;
    rp.D = priexp;

    rp.Modulus = mod;
    rsa.ImportParameters(rp);
    return rsa.Decrypt(b, false);
}

static List<byte[]> Base2Array(string str)
{
    byte[] b = Convert.FromBase64String(str);

    List<byte[]> Bytes = new List<byte[]>();

    int i = 0;
    while (i < b.Length)
    {
        int size = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b, i));
        i += 4;
        byte[] b2 = new byte[size];
        Array.Copy(b, i, b2, 0, size);
        Bytes.Add(b2);
        i += size;
    }

    return Bytes;
}


static void Main(string[] args)
{
    List<byte[]> pub = Base2Array("AAAAB3NzaC1yc2EAAAABJQAAAIBMW4HxU1glv+CcZpJnvUKEyeNfFoKkyLOVLOOb/vNXQkrkGsNdpYAZkKKizij8fD3u3/iYT8UI+xkFoyonRYVipgCslirJB1VdvLivXs69Ht4vf7VAv2yJSUni3XsIHauMlfOkjJ7DpUW75ZkrxsGieICFWlXvRnAyDdqQrkZRZQ==");
    List<byte[]> pri = Base2Array("AAAAgBSjHDNiojO3UXZg6Ux4VyrOx9SCn9mCWgykWTEUeR6Anp6DxhlPUw3UEEetVy97hlw8iGCEQxcvG4T7qocni9UtUTLdpuQzvr6718y2CP0ouKt/1hVKD9QssT08XUvJEBQnnl2yVZAbIqT/DGnUH36L0BnQE/2ombPakwHscfFFAAAAQQCSfQy2cP8Oa0IR0u0whxqGmuuXY/3tCD8NaaSCYm31ly0QBdxFdf2WkC51DNVaf5/1ErHceMapFN9Z3j+/6lA7AAAAQQCFcMoSA32f240nFBmMv/nn/mL1uSdAXOxjUHViJc6M8ntZvW2ZuP2qTvfA3mh1AK5K69piX/4T72xxqTA2tmrfAAAAQFxX1JunFI+fpobdienVCZcjibwbpDPf1MVTbwQhAXHqVBL3XXgkysS/67X/aWnv/+SdBDaXa1SnDpphSWOkxAQ=");

    //pub[0] 7
    //pub[1] 1
    //pub[2] 128

    //pri[0] 128
    //pri[1] 65
    //pri[2] 65
    //pri[3] 64

    byte[] pubmod = null;
    byte[] primod = null;
    byte[] pubexp = null;
    byte[] priexp = null;

    pubexp = pub[0];
    pubmod = pub[2];

    priexp = pri[0];
    primod = pri[2];


    byte[] bstr = Encoding.ASCII.GetBytes("Test");

    bstr = Encrypt(bstr, pubmod, pubexp);
    bstr = Decrypt(bstr, pubexp, pubmod, null);


    string str = Encoding.ASCII.GetString(bstr);
}

【问题讨论】:

  • 添加了不起作用的代码。
  • 微软的 RSA 类似乎非常基础,只接受其格式的密钥。哦,好吧,下载了充气城堡,我想弄清楚。

标签: c# rsa


【解决方案1】:

我会这样做:

public byte[] PublicDecryption(byte[] encryptedData)
{
        var encData = new BigInteger(encryptedData);
        BigInteger bnData = encData.modPow(_exponent, _modulus);
        return bnData.getBytes();
}

public byte[] PrivateDecryption(byte[] encryptedData)
{
    var encData = new BigInteger(encryptedData);
    d = new BigInteger(rsaParams.D);
    BigInteger bnData = encData.modPow(d, _modulus);
    return bnData.getBytes();
}

BigInteger 在哪里:

http://www.codeproject.com/KB/cs/biginteger.aspx

因为微软的实现是部分的和错误的。

我从来没有遇到过这个问题。

希望有帮助

【讨论】:

    【解决方案2】:

    几个月前,我尝试使用私钥加密和公钥解密来实现场景。我花了一周的时间尝试用 RSACryptoServiceProvider 来做这件事,然后......什么也没有。它们仅支持两个用例:

    1. 公钥加密,私钥(全)解密。

    2. 用私钥签名,用公钥验证。

    而且他们已经尽一切努力不允许您使用他们的 API 做其他事情。 请查看 msdn 论坛: 我找到了很多类似msdn 的答案,包括来自支持开发团队的答案。他们都说:这是设计禁止的。所以我的建议是不要尝试使用 RSACryptoServiceProvider,最好使用其他实现。

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 1970-01-01
      • 2014-04-16
      • 2012-07-17
      • 2011-08-10
      • 2018-01-16
      • 2023-04-03
      • 2015-06-22
      • 1970-01-01
      相关资源
      最近更新 更多