Импорт 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.
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