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

标签 python .net rsa pycrypto cryptoapi

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

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)

我懂了

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.

最佳答案

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)

关于python - 将从 .NET 导出的 CSP blob 导入到 python pyCrypto 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28288397/

相关文章:

c# - 将 Modbus RTU CRC 从 C# 移植到 python

java - 在 iOS (Swift) 上进行 RSA 签名并在 Java 中进行验证

java - 序列化 BigInteger : signum-magnitude mismatch

.net - 为什么 Uri 对查询部分进行部分解码?

c# - 从 WindowsService 我如何从 C# 中找到当前登录的用户?

c# - .net 强类型 View 模型未设置为对象实例

ios - 使用 ccrypto RSA 加密 2500 字节数据

python - 使用 while 编写一个简单的函数

python - django - 如何将图像数组发布到 View

python - celery 与 RabbitMQ : AttributeError: 'DisabledBackend' object has no attribute '_get_task_meta_for'