RSA解密,仅使用D,P,Q,U参数(GnuPG)

时间:2013-01-29 11:01:37

标签: c# rsa gnupg

我有一个RSA私钥,它只包含D,P,Q,U参数。

按键表示法http://www.gnupg.org/documentation/manuals/gcrypt/RSA-key-parameters.html

JavaScript执行解密

<html>
<head>
<SCRIPT SRC="http://eu.static.mega.co.nz/crypto_1.js"></SCRIPT>
<SCRIPT SRC="http://eu.static.mega.co.nz/rsa_1.js"></SCRIPT>
<SCRIPT SRC="http://eu.static.mega.co.nz/hex_1.js"></SCRIPT>
<SCRIPT>
function t()
{
// hex2s - conversion functions: hex to string
// mpi2b - conversion functions: num array <-> multi precision integer (mpi) mpi: 2 octets with length in bits + octets in big endian order
    t = mpi2b(hex2s('080043e8950c95dbc8fdea8fd39dfbc65f4ff31ee4824d8e8ceabdf45cbb928b29863e80154b656f04510e983810889f5d12cee85369743db65b0b54949ff5320c9ed98f3bb6b12a2c26e16a1b8414955034c0ed35b21e9bbc58d8447db85f9c760057656bb3a7b5c80726d287b5bc312525bff7864ba2dc2c627cd50e3d752cd585cb301d327f209974e29ddcd1ac51e99209f1d1f96c9fef5ef810b32a54555b5d7cc69c2a107d717744b5167a8962ca08aaac717768e8235795b21dcd186ba348317e685f07f9a2cac14089242b6edb989c8818054de2f69de34653c3e2d8b70947278f44a8995eb5c3568460dbe8e7a1cf31466556454703b045cef1c61e8d09'));   
    p = mpi2b(hex2s('04009868b3fea798829975abd91d27982462b66aced52f1472f243dadbf9e2e551388bb55750764cfc6ff5b89345285c0faa18924ee392f729d7980a6e1f62bff79584eee9e23d23d53a5034198b44dce9791eb367243a9ec6973eb09b574b65c4156a999fdf48770035c488efc568ad80b5dc73e9ca6c67bf9f09bdb31d175f25e5'));
    q = mpi2b(hex2s('0400d8ff209b2a325f66deee452e11b0306e7bc21dd99cdb8d175c8a08973f8b105b51a7a95b38d09ce72bf81178fbc902b3da791490d80bb0b6a8fa5e1c08636c57be45dbcc7b8c0da95390974f07456da5ca522f126b29b5226047432889482d983eb57679fe4e8d90aef2e06d8dbd0b6fa280b69ffddbd9c16bcd5f5569cef1f1'));
    d = mpi2b(hex2s('07fd1e65b3aa438c9cb5ea6b14590d32945f907d1fb6053541e3c250b5a60b67a477e5bfd2e79d0d4bdb6bde9403ab908723aeee25bfe69665fecc028c2fe4df2c51c8579235cc25f888055dc1da529017c4f4e38b95486b036345bb4c03f75b37c305002916a7f2ffe7a03b1b72bb7836560d556627b7bfff9357cdc73e6ed790f3bf79c6cd0fcd98ef2d96e369e780b3b213d3a5b7df8a373585bda0d22da00f7737ecf59ec0fc68056e65eda05c5940fbb3109d97db8ff135b472117467ec47620736b9e39a70723f33d59dea5a98d18bae8c89aa1be77daf692f5407c8433bd0b85cc13de12e7f8b85d27b147e2e8e337fc1157b0cb76ef90e479b5059ba27f1'));
    u = mpi2b(hex2s('03fe233721f3bda1e05d44de087b67749f4daafe02af79c183b2f41e040b6364a870c0896b84073de0fc1b7b2faee9100a250773282b6d9d935d30c1db2c7ef3daa017519dbb8d94edd32bde9ee0d460cb09d782b88f11552b810a595f6d26d12c38ee74c36d830b9d496947eeb878e6459b120bf747a28761926094797a4a5c9b68'));

    sid = base64urlencode(b2s(RSAdecrypt(t,d,p,q,u)).substr(0,43));

    if (sid=='tajetAbW0qTQGFlwp8iD5lQ0TFV1QUZJZFVvjRX7Xx-bPzYBoau7qog09w')
        console.log("Decrypting work");
}
</script>
</head>
<body onload="t();" />
</html>

我找到了BouncyCastle库并计算了RSAParameters的所有参数。但我无法解密数据。我在方法 RSACryptoServiceProvider.ImportParameters

中获得异常
using System;
using System.Globalization;
using System.Security.Cryptography;
using Org.BouncyCastle.Math;

namespace testConsole
{
    internal class Program
    {
        private static void Main()
        {
            string p_hex = "04009868b3fea798829975abd91d27982462b66aced52f1472f243dadbf9e2e551388bb55750764cfc6ff5b89345285c0faa18924ee392f729d7980a6e1f62bff79584eee9e23d23d53a5034198b44dce9791eb367243a9ec6973eb09b574b65c4156a999fdf48770035c488efc568ad80b5dc73e9ca6c67bf9f09bdb31d175f25e5";
            string q_hex = "0400d8ff209b2a325f66deee452e11b0306e7bc21dd99cdb8d175c8a08973f8b105b51a7a95b38d09ce72bf81178fbc902b3da791490d80bb0b6a8fa5e1c08636c57be45dbcc7b8c0da95390974f07456da5ca522f126b29b5226047432889482d983eb57679fe4e8d90aef2e06d8dbd0b6fa280b69ffddbd9c16bcd5f5569cef1f1";
            string d_hex = "07fd1e65b3aa438c9cb5ea6b14590d32945f907d1fb6053541e3c250b5a60b67a477e5bfd2e79d0d4bdb6bde9403ab908723aeee25bfe69665fecc028c2fe4df2c51c8579235cc25f888055dc1da529017c4f4e38b95486b036345bb4c03f75b37c305002916a7f2ffe7a03b1b72bb7836560d556627b7bfff9357cdc73e6ed790f3bf79c6cd0fcd98ef2d96e369e780b3b213d3a5b7df8a373585bda0d22da00f7737ecf59ec0fc68056e65eda05c5940fbb3109d97db8ff135b472117467ec47620736b9e39a70723f33d59dea5a98d18bae8c89aa1be77daf692f5407c8433bd0b85cc13de12e7f8b85d27b147e2e8e337fc1157b0cb76ef90e479b5059ba27f1";
            string u_hex = "03fe233721f3bda1e05d44de087b67749f4daafe02af79c183b2f41e040b6364a870c0896b84073de0fc1b7b2faee9100a250773282b6d9d935d30c1db2c7ef3daa017519dbb8d94edd32bde9ee0d460cb09d782b88f11552b810a595f6d26d12c38ee74c36d830b9d496947eeb878e6459b120bf747a28761926094797a4a5c9b68";

            BigInteger p = p_hex.HEX2Bytes().MPInteger2BigInteger();
            BigInteger q = q_hex.HEX2Bytes().MPInteger2BigInteger();
            BigInteger d = d_hex.HEX2Bytes().MPInteger2BigInteger();
            BigInteger u = u_hex.HEX2Bytes().MPInteger2BigInteger(); // not using???

            RSAParameters rsaKeyInfo = new RSAParameters
                                           {
                                               Exponent = new byte[] { 1, 0, 1 },
                                               Modulus = p.Multiply(q).ToByteArray(),
                                               P = p.ToByteArray(),
                                               Q = q.ToByteArray(),
                                               DP = d.Remainder(p.Subtract(BigInteger.One)).ToByteArray(),
                                               DQ = d.Remainder(q.Subtract(BigInteger.One)).ToByteArray(),
                                               InverseQ = q.ModInverse(p).ToByteArray(),
                                               D = d.ToByteArray()
                                           };

            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
                rsa.ImportParameters(rsaKeyInfo); //  !!!!!! CryptographicException   (Bad data)
        }
    }

    public static class Extensions
    {
        public static byte[] HEX2Bytes(this string hex)
        {
            if (hex.Length%2 != 0)
            {
                throw new ArgumentException(String.Format(CultureInfo.InvariantCulture,
                                                          "The binary key cannot have an odd number of digits: {0}", hex));
            }

            byte[] hexAsBytes = new byte[hex.Length/2];
            for (int index = 0; index < hexAsBytes.Length; index++)
            {
                string byteValue = hex.Substring(index*2, 2);
                hexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
            }

            return hexAsBytes;
        }

        public static BigInteger MPInteger2BigInteger(this byte[] mpi)
        {            
            int length = (((mpi[0] << 8) | mpi[1]+ 7)/8);
            return new BigInteger(1, mpi, 2, length);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

老实说我不太熟悉C#; 但 关于BigInteger.One我试试:

RSAParameters rsaKeyInfo = new RSAParameters
                                           {
                                               Exponent = new byte[] { 1, 0, 1 },
                                               Modulus = p.Multiply(q).ToByteArray(),
                                               P = p.ToByteArray(),
                                               Q = q.ToByteArray(),
                                               DP = d.Remainder(p.Subtract(BigInteger(1))).ToByteArray(),
                                               DQ = d.Remainder(q.Subtract(BigInteger(1))).ToByteArray(),
                                               InverseQ = q.ModInverse(p).ToByteArray(),
                                               D = d.ToByteArray()
                                           };

当然不是没有添加

using System.Numerics