2012-01-05 3 views
2

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

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

Перед программное обеспечение .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) 

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

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

Я был бы признателен за любые Комментарии!

ответ

0

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

sha1.ComputeHash (данных)

и

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

MSDN documentation о SignData:

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

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

+0

Спасибо Jcs - Я только что нашел ваш ответ. Мой клиент предоставил мне сообщение, в котором дважды звучало ... но его ИТ-подразделение забыло сообщить мне об этом. – sebzur