【问题标题】:Decryption with PublicKey of Smartcard Certificate使用智能卡证书的公钥解密
【发布时间】:2015-11-21 11:17:57
【问题描述】:

我目前正在使用来自德国项目的智能卡来保护/加密收银系统的某些数据(称为 INSIKA,如果有人知道的话)。智能卡包含一个证书,其中包含用于加密的 unkonwkn 私钥和用于解密数据的公钥。可以使用智能卡本身的功能对数据进行加密。不幸的是,没有这样的方法来解密加密数据。

INISKA 文档提到,我应该能够读取存储在智能卡上的证书并获取我可以用来实际解密 pdata 自己的公钥。但不知何故,我找不到合适的方法来做到这一点。使用我得到的智能卡:

  • 包含证书原始数据的字节数组
  • 使用此类的构造函数和原始数据的 X509Certificate2 实例
  • 使用证书实例的 GetPublicKey() 方法的公钥字节数组
  • PublicKey 属性包含一些信息,例如 Oid 或 AlgorithmId

到目前为止,我的大部分搜索结果都建议我应该使用如下所示的代码:

RSACryptoServiceProvider provider = (RSACryptoServiceProvider) certificate.PublicKey.Key;
byte[] decryptedData = provider.Decrypt(signature.SignatureByteArray, false);

但是,访问 .Key 属性会引发 NotSupportedException,并显示消息“不支持证书密钥算法。”。证书PublicKey.Oid属性包含公钥算法为ECC(黄道密码)的信息

有没有人有任何建议我可以做些什么来解密我设法使用我拥有的信息加密的数据?我是否可能缺少证书的某些部分或某些需要的功能来选择正确的密钥算法?是否有另一种使用公钥(例如字节数组)手动实例化一些解密类的方法(我发现的所有示例代码都需要一些我没有或不知道从哪里获得的信息,例如模数或指数)?提前致谢!

【问题讨论】:

  • 您可以随时读取整个证书并将其转储到文件中。然后在 Windows 中打开它,它将显示证书的所有属性,即:密钥、密钥类型、加密类型、指纹等。

标签: c# .net cryptography smartcard x509certificate2


【解决方案1】:

您不能解密签名。您只能验证它们。解密和验证是不同的概念,兼容 PKCS#1 的 RSA 对两者使用不同的填充机制——当然还有不同的密钥。

请改为查看RSACryptoServiceProviderVerifyDataVerifyHash 方法。您无法解密签名(如果可以,在 99% 的情况下,您只会取回 one-way-hash 值,而不是数据)。

【讨论】:

  • 感谢您的回复!由于我今天的最新研究,我已经期待这样的答案。我想我误解或误解了 INSIKA 概念的某些部分(因为他们在谈论非对称密码学)。但是,我仍然不确定如何获得正确的 RSACryptoServiceProvider,因为由于 NotSupportedException,我的证书的 PublicKey.Key 属性始终不可用。我在这里仍然缺少一些东西......
  • 呃哦,我想我知道它是什么了。您正在尝试使用 .NET 不支持的 Brainpool 曲线。 .NET 仅支持 NIST 曲线。您可能需要另一个库(可能是 Bouncy Castle)。显然,您不能将其转换为基于 RSA 的类类型。 ECC 和 RSA 是互斥的。
  • 再次感谢。我想我会尝试看看充气城堡。我已经找到了这个库,但还没有时间实际尝试一下。也许它会帮助我实现我的目标!
猜你喜欢
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
相关资源
最近更新 更多