2011-01-14 59 views
2

我正尝试在符合PIV的智能卡上执行主动卡身份验证。有关更多详细信息,请参见this document的附录A.2。如何在.Net中使用PKCS#1 v1.5编码数据

我有相关的X.509证书的公钥。我需要向卡发送一些随机数据,然后用私钥签名,然后我需要使用公钥验证签名。

的文档中的示例我选址,它们发送的数据进行签名的“编码按照PKCS#1 V1.5签名填充方案”的注释。如何编码我的随机数据?我认为填充数据是RSA签名过程的一部分。

// Generate random data 
byte[] randomData = new byte[128]; 
Random random = new Random(); 
random.NextBytes(randomData); 

// Hash the random data 
SHA1Managed sha1 = new SHA1Managed(); 
byte[] hash = sha1.ComputeHash(randomData); 

// Send the hash to the Smart Card and get back signed data 
byte[] signature = SendToSmartCardForSignature(hash); 

// Verify the data and the signature match using the public key 
RSACryptoServiceProvider rsa = smartCardCertificate.PublicKey; 
bool verified = rsa.VerifyData(randomData, CryptoConfig.MapNameToOID("SHA1"), signature); 

// verified is false...why? 

回答

2

“正确”的方式做到这一点使用.NET加密功能,以实现自己的执行System.Security.Cryptography.RSA。方法DecryptValue应该调用智能卡“原始”RSA私钥加密方法。此外,请记住重写KeySize属性。

然后可以使用RSAPKCS1SignatureFormatter垫的数据,并调用智能卡。

1

第9.2节 - this document的EMSA-PKCS1-v1_5描述了编码方法。

我找不到任何由.NET库为我做到这一点暴露出来,所以我手动做的,因为它是很容易的。

散列数据正如我在原来的代码示例中一样。

  1. 散列编码数据导入DigestInfo类ASN.1值 - 选址文件实际上提供了这样你就不必弄清楚为此所需的字节数组。我使用了SHA1,所以我只需要将下面的字节数组插入索引为0的散列数据字节数组中:(0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14

  2. PKCS# 1 v1.5编码的字节数组是{0x00,0x01,PS,0x00,T},其中T是第一步中的DigestInfo字节数组,PS是0xFF的字节数组。阵列PS的长度取决于你。在我的情况下,这个数组将被一个RSA-2048私钥签名,所以这个数组需要长度为0x100,所以我让PS长到足以达到这个目标。

发送编码的字节数组到智能卡上签名。智能卡将使用私钥执行实际的RSA操作并返回结果。 .NET VerifyData函数返回true。

+0

对不起,你可以帮我。你说你有一个2048位的rsa密钥,所以数组需要长度为0x100。如果我有1024位密钥,它的大小是多少? – GregaMohorko 2017-02-04 04:18:30

+1

我不确定,但可能是一半? 0x100是256,所以请尝试128或0x80。 – Ben 2017-02-05 15:31:04

相关问题