当前位置: 首页 > 知识库问答 >
问题:

一些特殊rsa私钥的坏数据

于嘉誉
2023-03-14

我们有一个C#/. Net 4.0应用程序,它从PEM文件中导入RSA私钥到RSACryptoServiceProvider。

该应用程序适用于512到4096位的RSA密钥,但不适用于特殊类型的RSA私钥。

在这里您可以找到两个示例键:测试键

OpenSSL命令:OpenSSL genrsa-out PRIVATE。钥匙2048

主要区别在于两个素数(p和q)的选择。它们不是由1024位生成的,而是非工作密钥中的1023位和1025位。根据RSA规范,这应该没问题。

但是在重要参数()上,我们总是得到一个带有“坏数据”的密码异常。有什么想法吗?如何获得更多信息,为什么私钥数据被拒绝,或者如何获得更多信息?如果微软要求rsa密钥,我们搜索信息,但找不到任何有用的规格。

OpenSSL和各种智能卡都可以使用这两个密钥,在使用这些私钥进行测试时也可以使用这些密钥。

以下是字节长度:

工作键:

  • 模数=

不工作键:

  • 模数=

还试图用BouncyCastle解析PEM文件并从中导出RsaParameter,但它们也被“坏数据”拒绝。(顺便说一句,使用BouncyCastle不是一个选项。:()

提前谢谢!

共有3个答案

屈健柏
2023-03-14

如果你用BouncyCastle来做这项工作会更好。下面是一些使用Rsa传递公钥进行加密和私钥进行解密的代码。这两个关键点也是使用BouncyCastle生成的,如您所见:

class Program
{
    private static string _csr;
    private static string _publicKey;
    private static string _privateKey;

    static void Main(string[] args)
    {
        GeneratePkcs10("braspag.com.br", "braspag", "BR", RootLenght.RootLength2048);
        CryptDecryptTest();

        Console.ReadKey();
    }

    private static void GeneratePkcs10
        (string domainName, string companyName, string countryIso2Characters, RootLenght rootLength)
    {
        try
        {
            var rsaKeyPairGenerator = new RsaKeyPairGenerator();
            var secureRandom = new SecureRandom();

            // Note: the numbers {3, 5, 17, 257 or 65537} as Fermat primes.
            // NIST doesn't allow a public exponent smaller than 65537, since smaller exponents are a problem if they aren't properly padded.
            // Note: the default in openssl is '65537', i.e. 0x10001.
            var genParam = new RsaKeyGenerationParameters
                (BigInteger.ValueOf(0x10001), secureRandom, (int)rootLength, 128);

            rsaKeyPairGenerator.Init(genParam);

            AsymmetricCipherKeyPair pair = rsaKeyPairGenerator.GenerateKeyPair();

            IDictionary attrs = new Hashtable();

            attrs.Add(X509Name.CN, domainName);
            attrs.Add(X509Name.O, companyName);
            attrs.Add(X509Name.C, countryIso2Characters);

            var subject = new X509Name(new ArrayList(attrs.Keys), attrs);

            var textWriter = new StringWriter(CultureInfo.InvariantCulture);
            var pemWriter = new PemWriter(textWriter);
            pemWriter.WriteObject(pair.Private);
            pemWriter.Writer.Flush();
            _privateKey = textWriter.ToString();
            textWriter.Close();

            textWriter = new StringWriter(CultureInfo.InvariantCulture);
            pemWriter = new PemWriter(textWriter);
            pemWriter.WriteObject(pair.Public);
            pemWriter.Writer.Flush();

            _publicKey = textWriter.ToString();
            textWriter.Close();

            ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA256WITHRSA", pair.Private, secureRandom);

            var pkcs10CertificationRequest = new Pkcs10CertificationRequest
                (signatureFactory, subject, pair.Public, null, pair.Private);
            _csr = Convert.ToBase64String(pkcs10CertificationRequest.GetEncoded());
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private static void CryptDecryptTest()
    {
        const string originalText = "test";

        var encryptedText = RsaEncryptWithPublic(originalText, _publicKey);

        var decryptedText = RsaDecryptWithPrivate(encryptedText, _privateKey);

        Console.WriteLine(string.Format("Original Text: {0}", originalText));
        Console.WriteLine(string.Format("Encrypted Text: {0}", encryptedText));
        Console.WriteLine(string.Format("Decrypted Text: {0}", decryptedText));
    }

    public static string RsaEncryptWithPublic(string clearText, string publicKey)
    {
        var bytesToEncrypt = Encoding.UTF8.GetBytes(clearText);

        var encryptEngine = new Pkcs1Encoding(new RsaEngine());

        using (var txtreader = new StringReader(publicKey))
        {
            var keyParameter = (AsymmetricKeyParameter)new PemReader(txtreader).ReadObject();

            encryptEngine.Init(true, keyParameter);
        }

        var encrypted = Convert.ToBase64String(encryptEngine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length));
        return encrypted;

    }

    public static string RsaDecryptWithPrivate(string base64Input, string privateKey)
    {
        var bytesToDecrypt = Convert.FromBase64String(base64Input);

        AsymmetricCipherKeyPair keyPair;
        var decryptEngine = new Pkcs1Encoding(new RsaEngine());

        using (var txtreader = new StringReader(privateKey))
        {
            keyPair = (AsymmetricCipherKeyPair)new PemReader(txtreader).ReadObject();

            decryptEngine.Init(false, keyPair.Private);
        }

        var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length));
         return decrypted;
}


    private enum RootLenght
    {

        RootLength2048 = 2048,

        RootLength3072 = 3072,

        RootLength4096 = 4096,

    }
}
章心水
2023-03-14

我也有类似的问题。多亏了你,我注意到一些缓冲区比预期多了一个字节。所有这些都有0作为第一个字节和一个值

赵夕
2023-03-14

以防其他人遇到同样的问题。一个MSDN Mod给了我一个与infos的链接,微软认为RSA密钥应该是什么样子。

2.2.2.9RSA私钥BLOB

对于2048位RSA密钥,P和Q预计分别为128字节...

 类似资料:
  • (我正在用MAC) 我的id_rsa以 但我希望一开始 我已将我的身份证发送给rsa。发布给服务器管理员以获得对服务器的访问权,因此我不想生成新密钥。 > 有什么方法可以将我的id_rsaopenssh私钥转移到RSA私钥吗?(请指挥。) 如果我可以传输,我是否还需要传输id_rsa。酒吧(请发命令。)看来是我的错。pub没有像id_rsa这样的头,所以我不确定是否也应该传输它。 非常感谢。

  • 我一直在阅读一些RSA文献和堆栈溢出问题,但我没有得到明确的答案。 仅给定一个RSA私钥模和私钥指数,这是我所拥有的全部(也足够用于所有密码相关操作),我能得到相关的公钥模和公钥指数吗? 另外,我是否可以仅用这两个参数获得私钥的编码形式?我在java中尝试了以下方法(java不是实际的请求),但是支持它的OpenSSL引擎失败,错误为:04000090:RSA例程:openSSL_internal

  • 我也尝试了npm ursa模块,不幸的是没有成功。

  • 我在使用Java Bouncycastle的客户机和使用Python RSA库的密钥服务器之间交换私钥时遇到了困难。PEM格式用于通过REST传输密钥。keyserver无法解密我提供的密钥(加密密码更改时需要),它需要PKCS#1或PKCS#8密钥和PEM,如下所示: 但是BouncyCastle的输出(使用JCEpeEncryptorBuilder和JcaMiscPEMGenerator)的起

  • 我正在使用JavaScript和Node.js处理一个消息传递项目。创建用户时,服务器使用node.js库生成RSA键区。私钥使用用户密码加密。在webapp上,当用户A向用户B发送消息时,使用用户B的公钥对数据进行加密。当用户B接收到消息时,使用他们的私钥和密码对消息进行解密。 我的问题是,虽然应用程序似乎可以加密数据,但我无法解密数据。抛出的错误消息实际上是“无法解密数据”,这是没有帮助的。

  • 我使用命令“ssh-keygen-t rsa”创建了一个没有密码的公钥,我打算将其用于github,但我错误地发送了公钥和私钥...... 这到底意味着什么?