1

我有在 Crypto++ 中创建的 DER 编码的 RSA 密钥对以及密码。它们是 Base64Encoded 字符串。我首先将数据从 Base64 解码为字节数组,但我不确定如何将它们加载到RSACryptoServiceProvider.

static void Main()
{
    string pbkeystr = "mypublickey";
    string pvkeystr = "myprivatekey";
    string cipherstr = "mycipher";

    byte[] pbkey = Convert.FromBase64String(pbkeystr);
    byte[] pvkey = Convert.FromBase64String(pvkeystr);
    byte[] cipher = Convert.FromBase64String(cipherstr);

    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

    //Set keys here..

    //Decrypt the cipher using private key
    rsa.Decrypt(pvkey, false);
}

没有设置键的功能。我发现的唯一东西是ImportParameters方法,它采用RSAParametersp, q, n, 模数, 指数等组成的类。我无权访问这些。

有什么办法可以将键加载为字符串?如何将密钥加载到RSACryptoServiceProvider

4

1 回答 1

1

有什么办法可以将键加载为字符串?如何将密钥加载到 RSACryptoServiceProvider 中?

从您的另一个 Crypto++ 问题,如何在 Crypto++ 中加载 Base64 RSA 密钥,看起来您只有公钥和私钥,因为您使用了DEREncodeand BERDecode。也就是说,您有 RSA 参数,而不是主题公钥信息和私钥信息。您的密钥缺少 OID 标识符和版本号。事情就这样好了。

Cryptographic Interoperability: Keys on the Code Project 中,您将需要一个 C# 类,在 Base64 解码后解析 ASN.1/DER。CodeProject 文章提供了一个调用 C# 类AsnKeyParser来读取 ASN.1/DER 并返回一个RSAParameters以加载到 CSP 中。

该类的代码AsnKeyParser大约有 800 行,还有五个其他支持文件可以实现这一切,因此将其放在这里并不合适。你应该自己下载。感兴趣的文件称为CSInteropKeys.zip.

一旦你连接到AsnKeyParser类中,它就像下面的 RSA 公钥一样简单。私钥类似,代码在 CodeProject 网站上给出。

// Your ASN.1/DER parser class
AsnKeyParser keyParser = new AsnKeyParser("rsa-public.der");
RSAParameters publicKey = keyParser.ParseRSAPublicKey();

// .Net class
CspParameters csp = new CspParameters;
csp.KeyContainerName = "RSA Test (OK to Delete)";    
csp.ProviderType = PROV_RSA_FULL;    // 1
csp.KeyNumber = AT_KEYEXCHANGE;      // 1

// .Net class
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
rsa.PersistKeyInCsp = false;
rsa.ImportParameters(publicKey);

不赞成链接到另一个站点上的文件,但我不知道如何提供其他信息。答案中涉及的源代码太多。


为了完整起见,.Net 并没有使互操作变得容易。他们不接受 ASN.1/DER 或 PEM。相反,.Net 接受一些 XML 表示的键。我相信您可以在RFC 3275, XML-Signature Syntax and Processing中找到它。Microsoft 不会为您说明这一点。当我写代码项目文章时,我有点把它拼凑在一起。

除了 ASN.1/DER 和 PEM 之外,也许我们应该在 Crypto++ 中添加一个类来反刍 XML。

于 2017-02-11T13:12:25.700 回答