Как кодировать данные с помощью PKCS # 1 v1.5 в .Net - PullRequest
2 голосов
/ 14 января 2011

Я пытаюсь выполнить активную проверку подлинности карты на PIV-совместимой смарт-карте. Подробнее см. Приложение A.2 в этом документе .

У меня есть открытый ключ из соответствующего сертификата 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 ]

2 голосов
/ 14 января 2011

«Правильный» способ сделать это с помощью крипто-функциональности .NET - реализовать собственную реализацию System.Security.Cryptography.RSA .DecryptValue -метод должен называть смарт-карты «необработанным» методом шифрования закрытым ключом RSA.Кроме того, не забудьте переопределить свойство KeySize.

Затем можно использовать RSAPKCS1SignatureFormatter для заполнения данных и вызова смарт-карты.

2 голосов
/ 14 января 2011

Раздел 9.2 - EMSA-PKCS1-v1_5 из В этом документе описан метод кодирования.

Я не смог найти ничего из того, что предоставлено библиотекой .NET, чтобы сделать это для меня,Я сделал это вручную, так как это довольно просто.

Хэшируйте ваши данные, как я делал в моем исходном примере кода.

  1. Кодируйте хешированные данные в значение типа ASN.1 типаDigestInfo - цитируемый документ фактически предоставляет байтовые массивы, необходимые для этого, поэтому вам не нужно разбираться в этом.Я использовал 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.

...