解密RSA签名的哈希时出现NotImplementedException

本文关键字:NotImplementedException 哈希时 RSA 解密 | 更新日期: 2023-09-27 18:27:03

我想在UWP应用程序中使用加密引擎验证私钥签名的SHA256哈希。哈希是从外部创建的,并使用带有密码短语的RSA私钥进行签名。然而,对于这个例子,我还生成了无符号散列。然后在最后对两个散列进行比较,以验证它们是否相同。

我已经使用OSX命令行创建了我的私钥和公钥,在这个博客中指定。

这给了我两个.pem文件。我的公钥具有以下结构:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3fasaNKpXDf4B4ObQ76X
qOaSRaedFCAHvsW4G0PzxL/...ETC ETC
-----END PUBLIC KEY-----

这是我解密散列的C#代码:

        //HASH THE INPUT STRING
        var inputText = "stringtohash";
        // put the string in a buffer, UTF-8 encoded...
        IBuffer input = CryptographicBuffer.ConvertStringToBinary(inputText,
            BinaryStringEncoding.Utf8);
        // hash it...
        var hasher = HashAlgorithmProvider.OpenAlgorithm("SHA256");
        IBuffer hashed = hasher.HashData(input);
        // format it...
        string ourhash = CryptographicBuffer.EncodeToBase64String(hashed);
        Debug.WriteLine(ourhash);
        //CONVERT EXTERNAL HASH TO BUFFER
        IBuffer data = CryptographicBuffer.DecodeFromBase64String("b18fbf9bc0fc7595af646155e18b71e1aeccf01719f9f293c72217d7b95cc2106edb419078c4c5c1c7f7d106b90198a4f26beb49ff4a714db4bface1f94fff193b8126ce05fe13825144a3dde97f55399846b6fd768f1fb152f1ba71bbf5cde8c1a7e58621a493070256e2444db36c346a88e870906529cf13c072ead50b6a01b2e74c7ef8c5d423e8ea25220f524b563ae2c3345b7837f9cd1a357540b1380c86287b9a240cf67f7518f11418352b665b657c5ffb6cbcb6126ec59e360de6304392b78cf4de79b52d73b8292df6a1e643d0c0f0945aae5949b391e2915772c996f03e6d1879192b7edf0f40c01b875e768358aa47a992070f628418ddf06472");
        //CONVERT PUBLIC KEY TO BUFFER
        IBuffer publickey = CryptographicBuffer.DecodeFromBase64String("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3fasaNKpXDf4B4ObQ76XqOaSRaedFCAHvsW4G0PzxL / RuAQFz80esZPyyDCps1PAbTKzQ + QblChPo7PJkbsU4HzNN4PIRGh5xum6SRmdvOowrlTUtyxdOkRJoFxmiR / VCea + PUspt26F7PLcK9ao5 + hVzMvPuqdYenqzd01f1t5hQEhFQ9qjB6Es8fpizHd / RSRfZ7n6rVKm9wYfCRLB7GJ7IHhWGuZrx9fjzsbW8eagu06qRhnUuR5oDVjXC8ZeazsRiw50xMuOzkhX9Oo081IYikwCgseJmQhT7vF4lZoyeB4qJpwTCA + glSy1w9N8ZfxyXK8QaT2RsrBrzl0ZCwIDAQAB");
        // Open an asymmetric algorithm provider for the specified algorithm. 
        AsymmetricKeyAlgorithmProvider rsa = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);
        // Import Key
        CryptographicKey key =  rsa.ImportPublicKey(publickey, CryptographicPublicKeyBlobType.X509SubjectPublicKeyInfo);
        // Decrypt the Hash using our Key
        IBuffer result = CryptographicEngine.Decrypt(key, data, null);
        Debug.WriteLine(result.ToString());
        //Compare the two hashes
        if (data == result) {
            //Hash is verified!
        }

不幸的是,当达到Decrypt方法时,我得到了一个带有错误的NotImplementedException

方法或操作未实现

我在网上进行了研究,我理解理论上需要发生什么,但我不知道如何进一步调试。我能尝试什么?

解密RSA签名的哈希时出现NotImplementedException

虽然两者都称为PKCS#1 v1.5填充,但签名生成和加密的填充并不相同,请参阅RFC 3447了解更多详细信息。

如果你看一下RsaPkcs1属性,你会发现它是针对加密的:

在调用OpenAlgorithm method时,使用此属性检索的字符串来设置非对称算法名称。该字符串表示使用PKCS1填充明文的RSA公钥算法。未使用哈希算法。

由于我看不到";原始RSA";,即没有填充的RSA,您似乎只能验证您的签名。但是,RSA解密需要RSA私钥。您很可能因此而出现错误:如果您尝试使用公钥进行解密,则会失败。

如果要预先计算哈希,可以使用VerifySignatureWithHashInput

对于其他功能,您可能必须使用例如Bouncy Castle的C#轻量级API。最终,您不需要平台提供的加密来验证签名。

相关文章:
  • 没有找到相关文章