Windows、RSA密钥结构的转换

100 篇文章 0 订阅

密钥结构的转换

一个程序同时用到CryptoAPIopenssl,如何将CryptoAPI中的密钥的句柄HCRYPTKEY转换成opensslRSA结构?

 如果HCRYPTKEY表示RSA公钥,则可以利用CryptExportKey导出公钥,根据MSDN介绍的Public Key BLOBs格式把moduluspubexp转换为RSA里对应的域就行了。

如果HCRYPTKEY表示RSA私钥,且私钥可以导出,可以利用CryptExportKey导出私钥,并填充RSA里对应的域。

如果HCRYPTKEY表示RSA私钥,且私钥不可以导出,需要实现一个RSA_METHOD,这样才可能使用opensslRSA结构实现解密和签名。

   

将密钥结构进行转换举例:

要把PFX文件导入到EKey的问题,可以分两步来做第一步是从PFX文件中获取到私钥和证书,第二步是把私钥和证书写入EKey

第一步可以有两种方法:一种是使用openssl来分解PFX文件来获取,这样可以获得PKCS#1格式的RSA私钥。另一种是使用PFXImportCertStorePFX文件到一个临时的certstore,注意要设置私钥可导出标志,然后在certstore里找到带私钥的证书导出其私钥。导出的私钥的格式MSDN private key blobs中有说明,大致如下

BLOBHEADER blobheader;

RSAPUBKEY rsapubkey;

BYTE modulus[rsapubkey.bitlen/8];

BYTE prime1[rsapubkey.bitlen/16];

BYTE prime2[rsapubkey.bitlen/16];

BYTE exponent1[rsapubkey.bitlen/16];

BYTE exponent2[rsapubkey.bitlen/16];

BYTE coefficient[rsapubkey.bitlen/16];

BYTE privateExponent[rsapubkey.bitlen/8];

注意字节序是little-endian

可能有些系统不支持PFXImportCertStore函数

第二步也可以有两种方式一种是使用明华提供的ECLib库把私钥和证书写入EKey。第二种方法是用CryptAcquireContext创建个新容器,再用CryptImportKey把私钥导入可能需要修改导出的私钥的格式,指定是导入到AT_KEYEXCHANGE还是AT_SIGNATURE位置。最后把证书写入容器即可。

下面的代码进行了初始化:

     rsa->e = BN_new();

     rsa->n = BN_new();     

     rsa->p = BN_new();

     rsa->q = BN_new();

     rsa->dmp1 = BN_new();

     rsa->dmq1 = BN_new();

     rsa->iqmp = BN_new();

     rsa->d = BN_new();

CryptExportKey导出的各个参数是little-endian的,而BN_bin2bn要求的输入是big-endian的,需要将参数反转一下使用BN_bin2bn



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C3平台使用的RSA密钥格式与C#中的标准格式有些不同。在C3平台上,公钥和私钥都是以字符串的形式存储的,并且使用特定的格式进行编码。如果需要在C#代码中使用C3平台上的RSA密钥,就需要将其进行格式转换。 下面是将C3平台上的RSA密钥转换为C#中的标准格式的步骤: 1. 从C3平台上获取公钥和私钥的字符串表示。在C3平台上,可以通过`RSA.getPublicKey()`和`RSA.getPrivateKey()`方法获取公钥和私钥的字符串表示。 2. 将公钥和私钥的字符串表示转换为字节数组。在C#中,可以使用`Convert.FromBase64String()`方法将Base64编码的字符串转换为字节数组。 3. 将字节数组转换为C#中的RSA密钥对象。在C#中,可以使用`RSACryptoServiceProvider.ImportCspBlob()`方法将字节数组转换RSA密钥对象。 下面是将C3平台上的RSA密钥转换为C#中的标准格式的示例代码: ```csharp string publicKeyString = "..."; // C3平台上的公钥字符串 string privateKeyString = "..."; // C3平台上的私钥字符串 byte[] publicKeyBytes = Convert.FromBase64String(publicKeyString); byte[] privateKeyBytes = Convert.FromBase64String(privateKeyString); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.ImportCspBlob(publicKeyBytes); // 导入公钥 rsa.ImportCspBlob(privateKeyBytes); // 导入私钥 ``` 在上面的代码中,`publicKeyString`和`privateKeyString`是C3平台上的公钥和私钥字符串。通过`Convert.FromBase64String()`方法将这两个字符串转换为字节数组,然后使用`RSACryptoServiceProvider.ImportCspBlob()`方法将字节数组转换RSA密钥对象。转换后,可以使用`rsa`对象进行加密和解密操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值