如何将SM2公钥加密的密文格式转换成新格式?

2026-05-30 18:406阅读0评论工具资源
  • 内容介绍
  • 文章标签
  • 相关推荐

SM2公钥加密密文格式转换问题分析

最近在项目中遇到了一个棘手的问题,使用外部开源的国密库进行SM2加密之后无法在腾讯云KMS系统上做解密。经过一番调研和分析,终于解决了这个问题。本文将记录解决此问题的关键步骤和分析思路,至于吗?。

问题背景

在KMS上, SM2私钥用户是不可见的,用户只能通过控制台下载公钥。我们反复确认了下载的公钥,所以呢可以排除是公钥与私钥不匹配的问题,不堪入目。。

国密 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私钥用户是不可见的,用户只能通过控制台下载公钥。我们反复确认了下载的公钥,所以呢可以排除是公钥与私钥不匹配的问题,不堪入目。。

国密 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编码,可以解决这个问题。