将从.NET导出的CSP blob导入python pyCrypto

时间:2015-02-02 22:56:21

标签: python .net rsa pycrypto cryptoapi

我在.NET应用程序中使用RSACryptoServiceProvider.ExportCspBlob从证书导出CPS Blob。

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

现在,我需要在python应用程序中导入该blob。我尝试使用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 Files   (x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ Extensio   用于Visual的ns \ Microsoft \ Python工具   Studio \ 2.1 \ visualstudio_py_util.py",第1行06,在exec_file中       exec_code(代码,文件,global_variables)文件" C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ Extensio   用于Visual的ns \ Microsoft \ Python工具   Studio \ 2.1 \ visualstudio_py_util.py",第8行2,在exec_code中       exec(code_obj,global_variables)文件" c:\ users \ marcinj \ documents \ visual studio   2013 \项目\ PythonApplication   1 \ PythonApplication1 \ PythonApplication1.py",第12行,in       seq.decode(keyDER)File" C:\ Python27 \ lib \ site-packages \ Crypto \ Util \ asn1.py",第237行,in   解码       提出ValueError("不是DER SEQUENCE。")ValueError:不是DER SEQUENCE。

1 个答案:

答案 0 :(得分:3)

CSP blob格式是Microsoft专有的,文档记录很少。我不是使用那种格式,而是使用ExportParameters方法来获取RSAParameters结构。从这个结构中,我将直接访问ExponentModulus字节数组,并对它们进行base64编码以传输到python程序,如下面的代码片段所示:

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

在python程序中,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)