当您尝试使用 PIV 卡的私钥和全局 PIN 签名时,RSACrypto服务提供商是否有效?



我正在尝试使用RSACryptoServiceProvider和指向全局引脚的CspParameters。如果我使用应用程序引脚,它可以正常工作,但当我使用全局引脚时,它会失败:"由于提供了错误的PIN,无法访问该卡。">

当我使用全局pin时,它会工作吗?有没有一个选项告诉它要寻找哪种类型的针?

提前谢谢。

更新:

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

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

2( 。哪个引脚被认为是主要引脚。(第二字节0x10=app,0x20=全局(

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

如果我输入应用程序引脚(P2设置为0x80(,并且它验证它是否正确,我也可以对此卡执行同样的操作。

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

使用RSACryptoServiceProvider和CspParameters,每当我将全局pin传递给它时,它就会失败。我收到"由于出示了错误的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...
}

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

如有任何建议,我们将不胜感激。

您似乎认为,从某种意义上说,PIN是可交换的,全局PIN是特定应用程序的适当替代品。这不是真的。

虽然卡可以这样设置(接受全局PIN,例如#1应用程序特定的PIN#2(,但您的卡显然不是。如果信用卡没有提供选择,服务提供商就无法成功。即使服务提供商使用了您想要的PIN并且比较成功,卡也不允许使用私钥。

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

(所有这些答案都假设,你不允许修改卡的内容,例如,你是一个普通的持卡人。(

最新更新