当您尝试使用 PIV 卡的私钥和全局密码进行签名时,RSACryptoServiceProvider 是不是有效?

Posted

技术标签:

【中文标题】当您尝试使用 PIV 卡的私钥和全局密码进行签名时,RSACryptoServiceProvider 是不是有效?【英文标题】:Does RSACryptoServiceProvider work when you try to sign using PIV card's private key and a global pin?当您尝试使用 PIV 卡的私钥和全局密码进行签名时,RSACryptoServiceProvider 是否有效? 【发布时间】:2020-04-17 15:26:33 【问题描述】:

我正在尝试将 RSACryptoServiceProvider 与指向全局引脚的 CspParameters 一起使用。 如果我使用应用程序引脚,它可以正常工作,但是当我使用全局引脚时,它会失败: “由于输入的 PIN 码错误,无法访问该卡。”

当我使用全局 pin 时它会起作用吗?是否有一个选项告诉它要寻找什么类型的引脚?

提前致谢。

更新:

我正在从智能卡中检索发现对象(如果存在)。 这将告诉我两件我想知道的事情。

1)。如果卡同时具有应用和全局引脚。 (引脚使用的第一个字节> = 60)

2)。哪个引脚被认为是主要的。 (第二个字节 0x10 = 应用程序,0x20 = 全局)

我有一张卡 NIST Test Pivcard 3,它有两个引脚,但全局引脚是主要的。对于这张卡,当我在我的测试表上输入全局密码时,我可以对其进行验证,它会正确验证密码。 (CLA=0x00, INS=0x20, P1=0x00, P2=0x00, Lc=0x8)

如果我输入应用程序密码(P2 设置为 0x80)并正确验证,我可以对这张卡执行相同的操作。

在我验证密码、设置 AID 并从卡中获取一些其他 x509 数据后,我尝试使用卡的私钥对一些散列数据进行签名。

使用 RSACryptoServiceProvider 和 CspParameters 时,只要我将全局引脚传递给它,它就会失败。我收到“无法访问该卡,因为提供了错误的 PIN。”

如果我向它传递一个有效的应用程序 pin,那么它就可以正常工作。

我的代码如下所示:

try

SecureString ss = new SecureString();
char[] PINs = PIN.ToCharArray();
foreach (char a in PINs)

    ss.AppendChar(a);

CspParameters csp = new CspParameters(1, "Microsoft Base Smart Card Crypto Provider");
csp.Flags = CspProviderFlags.UseDefaultKeyContainer;
csp.KeyPassword = ss;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
byte[] data = File.ReadAllBytes(hashFile);
sig = rsa.SignHash(data, "SHA1");
bool verified = rsa.VerifyHash(data, CryptoConfig.MapNameToOID("SHA1"), sig);

catch (Exception ex)

  txt_msg.Text = ex.Message;
  etc...

这里是否缺少一些标志来说明正在使用的引脚是全局引脚?还是我们不允许使用全局引脚?还是我在这里错过了其他东西?这是我第一次尝试使用 RSACryptoServiceProvider,我可能缺少一些基础知识。

任何建议将不胜感激。

【问题讨论】:

您必须先写一个新的 PIN 才能使用新的密码打开。那么你保存了 PIN 码吗? 我只是想使用卡的私钥和现有的密码来签署一些散列数据。我不是要创建一个新的 PIN 码。当我执行 RSACryptoServiceProvider 命令时,它失败并出现错误。即CspParameters csp = new CspParameters(1, "Microsoft Base Smart Card Crypto Provider"); csp.Flags = CspProviderFlags.UseDefaultKeyContainer; csp.KeyPassword = ss; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); 【参考方案1】:

您似乎假设 PIN 在某种意义上是可交换的,全局 PIN 是特定应用程序的合适替代品。这不是真的。

虽然可以通过这种方式设置卡(接受全局 PIN,例如 #1 OR 应用程序特定 PIN #2),但您的卡显然不是。如果卡不提供选择,服务提供商就无法成功。即使服务提供商使用了您想要的 PIN 并且比对成功,该卡也不会允许使用私钥。

不,您无法根据自己的喜好更改签名所需的 PIN 的 ID,因为攻击者也可以使用此路径。

(所有这些答案都假设您不允许修改卡片内容,例如您是普通持卡人。)

【讨论】:

嗨吉多。感谢回复。如果您熟悉他们的卡,我正在使用 NIST 测试卡#3。它有一个发现对象,表明它允许两种引脚类型(全局引脚和应用程序引脚)。它还指定全局 PIN 是主 PIN。当我使用 pkcs15-crypt 使用此卡对数据进行签名时,它可以使用任一 PIN。但是当我使用 RSACryptoServiceProvider 并使用全局 PIN 时,它会失败。应用程序 PIN 可以工作。在我看来,如果全局 PIN 是主要的,那么我应该能够使用它进行签名。但也许我错过了什么。 我更新了帖子以试图澄清事情。

以上是关于当您尝试使用 PIV 卡的私钥和全局密码进行签名时,RSACryptoServiceProvider 是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

RSA公私钥和签名、验签过程

如果有人得到我的私钥和公钥,JWT 会发生啥?

hbuilder打包ios需要的私钥和profile文件和私钥证书怎么获得

RSA公钥,私钥和数字签名通用理解

[转]公钥,私钥和数字签名这样最好理解

公钥,私钥和数字签名这样最好理解