2015-02-02 5 views
2

내 .NET 응용 프로그램에서 RSACryptoServiceProvider.ExportCspBlob을 사용하는 인증서에서 내 보낸 CPS BLOB가 있습니다. .NET에서 Python으로 내 보낸 CSP blob 가져 오기 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

CSP의 BLOB 형식은 마이크로 소프트 독점하고 제대로 문서화되어지고 있어요. 형식을 사용하는 대신 ExportParameters 메서드를 사용하여 RSAParameters 구조체를 얻습니다. 이 구조체에서 나는 직접 ExponentModulus 바이트 배열에 액세스 할과 64 기수는 다음 코드에서와 같이, 파이썬 프로그램 전송을 인코딩 :

파이썬 프로그램에서
var rsa = RSA.Create(); 
var RsaParms = rsa.ExportParameters (false); 
Console.WriteLine (Convert.ToBase64String(RsaParms.Modulus)); 
Console.WriteLine (Convert.ToBase64String (RsaParms.Exponent)); 

이 PyCrypto의 RSA에 대한 설명서가 언급 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)