如何将SM2公钥加密的密文格式转换成新格式?
- 内容介绍
- 文章标签
- 相关推荐
SM2公钥加密密文格式转换问题分析
最近在项目中遇到了一个棘手的问题,使用外部开源的国密库进行SM2加密之后无法在腾讯云KMS系统上做解密。经过一番调研和分析,终于解决了这个问题。本文将记录解决此问题的关键步骤和分析思路,至于吗?。
问题背景
在KMS上, SM2私钥用户是不可见的,用户只能通过控制台下载公钥。我们反复确认了下载的公钥,所以呢可以排除是公钥与私钥不匹配的问题,不堪入目。。

| 产品 | 功能简介 |
|---|---|
| 腾讯云KMS | 提供密钥管理服务, 支持国密算法 |
| 外部开源国密库 | 提供国密算法实现,包括SM2加密 |
问题分析
也许吧... 先说说我们检查了加密接口的参数设置,发现参数设置是正确的,并没有问题。然后我们对公钥做了base64解码,发现解码后的公钥数据并不是标准的65字节,而是91字节。
通过向KMS侧咨询,我们了解到,从KMS平台下载的公钥,其格式是做过ASN1编码的。所以呢,我们需要对公钥做ASN1解码,好吧...。
ASN1解码
我们定义了一个SM2PubKeyASN1Sequence类来解析ASN1编码的公钥数据。通过这个类,我们可以获取到正确的SM2公钥数据,心情复杂。。
class SM2PubKeyASN1Sequence:
componentType = (
('field-0',
(
componentType = (
),
)
)
)),
)
)
密文格式转换
在使用正确的公钥加密后我们发现仍然解密失败。所以呢,我们怀疑是不是密文数据有问题。 太扎心了。 经过检查,我们发现密文格式不符合KMS的要求。
太坑了。 KMS要求密文格式为ASN1编码的C1C3C2格式, 而外部开源库生成的密文是裸密文,不符合KMS的要求。所以呢,我们需要对密文进行ASN1编码。
class SM2_C1C3C2_ASN1_Ciphertext:
componentType = (
),
),
),
)
)
解决方案
通过对公钥做ASN1解码和对密文进行ASN1编码,我们成功解决了这个问题。到头来我们获得了65字节的SM2公钥数据和符合KMS要求的密文格式。
解密数据符合预期,问题得以解决。
在使用外部开源国密库进行SM2加密时需要注意公钥和密文的格式是否符合KMS的要求。通过对公钥做ASN1解码和对密文进行ASN1编码,可以解决这个问题。
SM2公钥加密密文格式转换问题分析
最近在项目中遇到了一个棘手的问题,使用外部开源的国密库进行SM2加密之后无法在腾讯云KMS系统上做解密。经过一番调研和分析,终于解决了这个问题。本文将记录解决此问题的关键步骤和分析思路,至于吗?。
问题背景
在KMS上, SM2私钥用户是不可见的,用户只能通过控制台下载公钥。我们反复确认了下载的公钥,所以呢可以排除是公钥与私钥不匹配的问题,不堪入目。。

| 产品 | 功能简介 |
|---|---|
| 腾讯云KMS | 提供密钥管理服务, 支持国密算法 |
| 外部开源国密库 | 提供国密算法实现,包括SM2加密 |
问题分析
也许吧... 先说说我们检查了加密接口的参数设置,发现参数设置是正确的,并没有问题。然后我们对公钥做了base64解码,发现解码后的公钥数据并不是标准的65字节,而是91字节。
通过向KMS侧咨询,我们了解到,从KMS平台下载的公钥,其格式是做过ASN1编码的。所以呢,我们需要对公钥做ASN1解码,好吧...。
ASN1解码
我们定义了一个SM2PubKeyASN1Sequence类来解析ASN1编码的公钥数据。通过这个类,我们可以获取到正确的SM2公钥数据,心情复杂。。
class SM2PubKeyASN1Sequence:
componentType = (
('field-0',
(
componentType = (
),
)
)
)),
)
)
密文格式转换
在使用正确的公钥加密后我们发现仍然解密失败。所以呢,我们怀疑是不是密文数据有问题。 太扎心了。 经过检查,我们发现密文格式不符合KMS的要求。
太坑了。 KMS要求密文格式为ASN1编码的C1C3C2格式, 而外部开源库生成的密文是裸密文,不符合KMS的要求。所以呢,我们需要对密文进行ASN1编码。
class SM2_C1C3C2_ASN1_Ciphertext:
componentType = (
),
),
),
)
)
解决方案
通过对公钥做ASN1解码和对密文进行ASN1编码,我们成功解决了这个问题。到头来我们获得了65字节的SM2公钥数据和符合KMS要求的密文格式。
解密数据符合预期,问题得以解决。
在使用外部开源国密库进行SM2加密时需要注意公钥和密文的格式是否符合KMS的要求。通过对公钥做ASN1解码和对密文进行ASN1编码,可以解决这个问题。

