Импорт CSP blob экспортирован from.NET в python pyCrypto



У меня есть большой двоичный объект CPS, экспортированный из сертификата с помощью RSACryptoServiceProvider.ExportCspBlob в моем приложении .NET.





return Convert.ToBase64String(rsaAlg.ExportCspBlob(false /*includePrivateParameters*/));


Теперь мне нужно импортировать этот большой двоичный объект в приложение python. Я попытался использовать pyCrypto, но безуспешно.





# that's the value I'm getting from .NET code above
key = 'BgIAAAAkAABSU0ExAAgAAAEAAQARMnLlzOgHkmHssf6ZSFJn8TlTiOBSoRSEnkI4U0UI6n1jFY2bTWS9O5uApMNXz1vr5OyxoXsNVF2XrNM4DOC+lRn3R/H+mZZxZY1F8oXxhe4L5AFOMhyykPreQtu9z+oKOzVB80zR+EU+nc/290POVK9/LGzP94cTk0VHSZdXDgL1eOiXLSg8h1OnJmMGxY6HyNvbF90onoHMWNrIeRue1vP/S5QLwuzkHv6tgm54bSwXWXFdDRbjtrA9HJkbf74hflAIqivO34bx+53whl2fEsC51eXqFdCr7XJJw+bwlENwDF9bUtCXQ+jXbiYtzvMbntRCKZ8LPRqlN9OWrBC2';

from Crypto.PublicKey import RSA
from Crypto.Util import asn1
from base64 import b64decode

# let's decrypt base64 first
keyDER = b64decode(key)

seq = asn1.DerSequence()
seq.decode(keyDER)
keyPub = RSA.importKey(keyDER)


Я получаю




Обратная трассировка (самый недавний призыв последнего): файл "C:Program файлы
(x86)Microsoft Visual Studio 12.0Common7IDEExtensio
инструменты nsMicrosoftPython для Visual
Studio2.1visualstudio_py_util.py", строка 1 06, in exec_file
exec_code (код, файл, global_variables) файл "C:Program файлы (x86)Microsoft Visual Studio 12.0Common7IDEExtensio
инструменты nsMicrosoftPython для Visual
Studio2.1visualstudio_py_util.py", строка 8 2, в exec_code
exec (code_obj, global_variables) файл "c:usersmarcinjdocumentsvisual студия
2013ПроектыPythonApplication
1PythonApplication1PythonApplication1.py", строка 12, in
след..декодировать файл(кейдер) "C:Python27libsite-packagesCryptoUtilasn1.py", строка 237, в
декодировать
raise ValueError ("не последовательность DER.") ValueError: не последовательность DER.


663   1  

1 ответ:

Формат CSP blob является собственностью Microsoft и плохо документирован. Вместо того, чтобы использовать этот формат, я бы использовал ExportParameters способ получения RSAParameters структура. Из этой структуры я бы непосредственно обратился к массивам байтов Exponent и Modulus и base64 закодировал их для передачи в программу python, как в следующем фрагменте кода:

var rsa = RSA.Create ();
var RsaParms = rsa.ExportParameters (false);
Console.WriteLine (Convert.ToBase64String( RsaParms.Modulus));
Console.WriteLine (Convert.ToBase64String (RsaParms.Exponent));

В программе python документация для RSA PyCrypto importKey упоминает несколько вариантов приемлемых форматов. Самый простой из них это структура PKCS#1 RSAPublicKey. Это довольно легко построить из модуля asn1, как в следующем фрагменте:

mod_raw = b64decode('qLhDLGNh7+9xRahkaWILm5HcG3T0Q4SUoDA3bpQtqLxU3AQ/fmYQWLXh0Se1mhQ3AIMduVgKaJhK1sH+G/toXuQ0n5ENw6PtGMODwsDXF072kaBKD3JBZSESC9a9a8QDoGtv7WwvH1UcIE9di60C7YdBMlqqBgkjMQ6c3CTh9KU=')
exp_raw = b64decode('EQ==')
mod = int.from_bytes(mod_raw, 'big')
exp = int.from_bytes(exp_raw, 'big')
seq = asn1.DerSequence()
seq.append(mod)
seq.append(exp)
der = seq.encode()
keyPub = RSA.importKey(der)

Comments

    Ничего не найдено.