Проверка подписи сообщения RSACryptoServiceProvider с помощью m2crypto - PullRequest
2 голосов
/ 05 января 2012

У меня есть сообщение с подписью .Net RSACryptoServiceProvider, затем сообщение отправляется программному обеспечению Python, которое пытается проверить знак с помощью m2crypto (lib на основе openssl).

У меня есть открытый сертификат, чтоявляется парой для закрытого ключа, с которым было подписано сообщение.

Перед тем как программа .Net отправляет сигнал, она преобразует его с помощью ByteArrayToString, поскольку знак генерируется с помощью следующего кода:

  //Convert plain text into a byte array to sign.
   byte[] data = new UTF8Encoding().GetBytes(phrase);
   SHA1Managed sha1 = new SHA1Managed();
   byte[] hashBytes = sha1.ComputeHash(data); 

   byte[] sig = csp.SignData(hashBytes, CryptoConfig.MapNameToOID("SHA1")); 

Таким образом, подпись, отправленная получателю,

ByteArrayToString(sig)

Часть Python:

   def verify(message, signature, cert_path):
      msg = hashlib.sha1(message).hexdigest()
      certificate = M2Crypto.X509.load_cert(cert_path)
      pubkey = certificate.get_pubkey()
      pubkey.reset_context(md='sha1')
      pubkey.verify_init()
      pubkey.verify_update(msg)
      sgn = signature.decode('base64')
      is_verified = pubkey.verify_final(sgn)

И я не могу получить подтверждение ... Я думаю, что может быть проблема скодирование подписи в части Python, но, может быть, кто-то может увидеть здесь другие ошибки?

Когда я использую свой собственный сертификат (сгенерированный с помощью openssl) и подписываю сообщение от самого Python, кодирую подпись, отправляю ее,затем расшифруйте и убедитесь, что все работает нормально ...

Буду признателен за любые комментарии!

1 Ответ

0 голосов
/ 06 января 2012

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

sha1.ComputeHash (данные)

и

csp.SignData (hashBytes, CryptoConfig.MapNameToOID ("SHA1"))

В документации MSDN о SignData указано:

Вычисляет значение хеша указанного байтового массива, используя указанный алгоритм хеширования и подписывает полученное значение хеш-функции.

Поэтому я не думаю, что вы должны предварительно хешировать сообщение перед созданием подписи.

...