2015-12-17 110 views
1

我想在UWP应用程序中使用CryptographicEngine验证私钥已签名SHA256散列。散列是在外部创建的,并使用带有密码的专用RSA密钥进行签名。然而,对于这个例子,我也生成了未签名的哈希。然后在最后比较两个哈希值以验证它们是否相同。解密RSA签名散列时NotImplementedException

我使用OSX命令行创建了我的私钥和公钥,在this blog中指定。

这给了我两个.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错误

该方法或操作未实施

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

+0

描述缺乏。 SHA256哈希是用公钥加密的吗?如果是这样,为什么它使用公钥而不是私钥解密。除非签名,否则通常不用私钥加密。 – zaph

+0

是的SHA256是用私钥签名的。我已更新该帖子。 – WJM

回答

1

虽然两者称为PKCS#1 V1.5填充,签名生成和加密填充是不相同,见RFC 3447更多的细节。

如果你看看the RsaPkcs1 property你可以看到它是针对加密:

使用此属性检索到的字符串来设置非对称加密算法的名字,当你调用OpenAlgorithm method。该字符串表示使用PKCS1填充明文的RSA公钥算法。没有使用哈希算法。

由于我没有看到“原始RSA”的任何选项,即没有填充的RSA,看起来您只能验证您的签名。但是,RSA解密需要一个RSA私钥。这很可能是因为这个原因你得到错误:如果你尝试使用公钥进行解密,它将会失败。

如果要预先计算散列,可以使用VerifySignatureWithHashInput

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

+1

谢谢。我通过使用VerifySignatureWithHashInput方法解决了我的问题。 – WJM

+0

哦,完美啊,我会在...中编辑它... –