2015-02-02 5 views
2

У меня есть CPS Blob, экспортированный из сертификата с использованием RSACryptoServiceProvider.ExportCspBlob в моем приложении .NET.Импорт CSP blob экспортируется из .NET в python pyCrypto

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

Теперь мне нужно импортировать блоб в приложении питона. Я попытался использовать 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) 

Я получаю

Traceback (most recent call last): File "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensio ns\Microsoft\Python Tools for Visual Studio\2.1\visualstudio_py_util.py", line 1 06, in exec_file exec_code(code, file, global_variables) File "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensio ns\Microsoft\Python Tools for Visual Studio\2.1\visualstudio_py_util.py", line 8 2, in exec_code exec(code_obj, global_variables) File "c:\users\marcinj\documents\visual studio 2013\Projects\PythonApplication 1\PythonApplication1\PythonApplication1.py", line 12, in seq.decode(keyDER) File "C:\Python27\lib\site-packages\Crypto\Util\asn1.py", line 237, in decode raise ValueError("Not a DER SEQUENCE.") ValueError: Not a DER SEQUENCE.

ответ

3

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

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

В программе питона, документация для 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^