数据加密服务 DEW
数据加密服务 DEW
- 最新动态
- 功能总览
- 产品介绍
- 计费说明
- 快速入门
- 用户指南
- 最佳实践
- API参考
- SDK参考
- 场景代码示例
-
常见问题
-
密钥管理类
- 什么是密钥管理?
- 什么是用户主密钥?
- 什么是默认密钥?
- 自定义密钥与默认密钥有什么区别?
- 什么是数据加密密钥?
- 为什么不能立即删除用户主密钥?
- 哪些云服务使用KMS加密数据?
- 华为云服务如何使用KMS加密数据?
- 信封加密方式有什么优势?
- 在KMS中创建的自定义密钥的个数是否有限制?
- 是否可以从KMS中导出用户主密钥?
- 如果自定义密钥被彻底删除,用户数据是否还可以解密?
- 如何使用在线工具加解密数据?
- 是否可以更新KMS管理的密钥?
- 在什么场景下推荐使用导入的密钥?
- 密钥材料被意外删除时如何处理?
- 默认密钥如何生成?
- 没有权限操作KMS,该如何处理?
- 如何修补OpenSSL以使用-id-aes256-wrap-pad包装非对称密钥?
- 如何修补GmSSL以使用-sms4-wrap-pad包装非对称密钥?
- KMS支持的密钥算法类型
- 请求KMS异常,错误码401,应该如何处理?
- 进行SM2签名时,如何计算SM3摘要?
- 调用encrypt-data接口,返回的密文和明文有什么关系?
- KMS如何保护创建的密钥?
- 如何使用非对称密钥对公钥对签名结果进行验签?
- 外部导入的密钥支持轮转吗?
- 密钥管理服务支持离线加解密数据吗?
- 为什么SM2算法签名结果不是64字节?
- 如何将原始EC私钥转换成PKCS8格式的私钥对象?
- 如何将原始SM2私钥转换成PKCS8格式的私钥对象?
- 凭据管理类
-
密钥对管理类
- 密钥对的配额是多少?
- 如何创建密钥对?
- 什么是私有密钥对和账号密钥对?
- 导入通过PuTTYgen工具创建的密钥对失败如何处理?
- 使用IE9浏览器无法导入密钥对如何处理?
- 如何使用私钥登录Linux弹性云服务器?
- 如何通过私钥获取Windows弹性云服务器的登录密码?
- 绑定密钥对失败如何处理?
- 替换密钥对失败如何处理?
- 重置密钥对失败如何处理?
- 解绑密钥对失败如何处理?
- 替换密钥对后,服务器需要重启吗?
- 关闭弹性云服务器的密码登录方式后如何重新开启?
- 解绑密钥对后用户无法登录ECS时如何处理?
- 私钥不慎遗失怎么办?
- 如何转换私钥文件格式?
- 密钥对在创建主机成功之后可以更改吗?
- 密钥对是否支持多用户共享?
- 如何获取密钥对的私钥或公钥文件?
- 账号密钥首次创建、首次升级时系统报错如何处理?
- 私有密钥对升级账号密钥对后,会占用账号密钥对配额吗?
- 用户联邦身份登录时,私有密钥对升级账号密钥对之后,为什么私有密钥对会不可见?
- 专属加密类
- 计费类
- 通用类
-
密钥管理类
- 视频帮助
- 文档下载
- 通用参考
本文导读
展开导读
链接复制成功!
如何将原始SM2私钥转换成PKCS8格式的私钥对象?
背景
SM2私钥是一个256bits的大整数,但是在密钥对导入场景,要求私钥对象是ASN.1编码之后,再对数据进行二进制编码,得到DER格式。仅通过OPENSSL命令无法获得。
本示例介绍如何将一个原始的SM2私钥转换成PKCS8格式的私钥。
环境准备
- 搭建JAVA环境,并引入bouncy castle 1.78及其以后的版本。
- 环境安装OpenSSL 1.1.1m及以后的版本。
将私钥转换为PKCS8对象
sm2p256v1的私钥示例, 原始私钥16进制表示如下:
```5AF8F37036DFF6C303B65DF52674B6B8269BCDF1D70DC6305D93F975DCA2469A```
- 示例的私钥仅作演示使用,请勿用到实际生产环境。
- 本示例不包含修补GmSSL启用包装密钥算法。
通过如下代码,将私钥转换成PKCS8对象:
```java import org.bouncycastle.asn1.gm.GMNamedCurves; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; import org.bouncycastle.jce.ECNamedCurveTable; import org.bouncycastle.jce.interfaces.ECPrivateKey; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec; import org.bouncycastle.jce.spec.ECParameterSpec; import org.bouncycastle.jce.spec.ECPrivateKeySpec; import org.bouncycastle.jce.spec.ECPublicKeySpec; import org.bouncycastle.math.ec.ECPoint; import java.math.BigInteger; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.Security; import java.security.spec.InvalidKeySpecException; import java.security.spec.InvalidParameterSpecException; import java.util.Base64; public class RawSm2PrivateKeyToPKCS8Object { private static final String CURVE_NAME = "sm2p256v1"; private static final X9ECParameters X9_EC_PARAMETERS = GMNamedCurves.getByName(CURVE_NAME); private static final ECParameterSpec EC_PARAMETER_SPEC = new ECNamedCurveParameterSpec(CURVE_NAME, X9_EC_PARAMETERS.getCurve(), X9_EC_PARAMETERS.getG(), X9_EC_PARAMETERS.getN()); public static void main(String[] args) throws InvalidParameterSpecException, NoSuchAlgorithmException, InvalidKeySpecException { Security.addProvider(new BouncyCastleProvider()); KeyFactory keyFactory = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider()); // 替换成待导入的私钥,如下内容仅为示例,实际使用时请替换 String hexPrivateKey = "5AF8F37036DFF6C303B65DF52674B6B8269BCDF1D70DC6305D93F975DCA2469A"; BigInteger d = new BigInteger(hexPrivateKey, 16); ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(d, EC_PARAMETER_SPEC); BCECPrivateKey ec = new BCECPrivateKey("EC", ecPrivateKeySpec, BouncyCastleProvider.CONFIGURATION); ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(CURVE_NAME); ECPoint q = ecSpec.getG().multiply(((ECPrivateKey) ec).getD()); ECPublicKeySpec pubSpec = new ECPublicKeySpec(q, ecSpec); PublicKey publicKey = keyFactory.generatePublic(pubSpec); BCECPrivateKey ec2 = new BCECPrivateKey("EC", ec.engineGetKeyParameters(), (BCECPublicKey) publicKey, ecPrivateKeySpec.getParams(), BouncyCastleProvider.CONFIGURATION); System.out.println(Base64.getEncoder().encodeToString(ec2.getEncoded())); } } ```
执行上述代码,获得如下输出:
```ignorelang MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgWvjzcDbf9sMDtl31JnS2uCabzfHXDcYwXZP5ddyiRpqgCgYIKoEcz1UBgi2hRANCAATOxASdjgJXIhnJOF/bTZwE0mnK6BEGoJIOmFHQzpMbrlu+hoRIXOGX/pEtsZqJsKZLD99/iDjB5bM9y/f9GaEC ```
使用ASN.1解码工具查看:
``` <SEQUENCE> <INTEGER/> <SEQUENCE> <OBJECT_IDENTIFIER Comment="ANSI X9.62 public key type" Description="ecPublicKey">1.2.840.10045.2.1</OBJECT_IDENTIFIER> <OBJECT_IDENTIFIER Comment="China GM Standards Committee" Description="sm2ECC">1.2.156.10197.1.301</OBJECT_IDENTIFIER> </SEQUENCE> <OCTET_STRING> <SEQUENCE> <INTEGER>1</INTEGER> <OCTET_STRING>0x5AF8F37036DFF6C303B65DF52674B6B8269BCDF1D70DC6305D93F975DCA2469A</OCTET_STRING> <NODE Sign="a0"> <OBJECT_IDENTIFIER Comment="China GM Standards Committee" Description="sm2ECC">1.2.156.10197.1.301</OBJECT_IDENTIFIER> </NODE> <NODE Sign="a1"> <BIT_STRING Bits="520">0x0004CEC4049D8E02572219C9385FDB4D9C04D269CAE81106A0920E9851D0CE931BAE5BBE8684485CE197FE912DB19A89B0A64B0FDF7F8838C1E5B33DCBF7FD19A102</BIT_STRING> </NODE> </SEQUENCE> </OCTET_STRING> </SEQUENCE> ```
将如下内容写入到命名为“sm2_private_key.pem”的文件中:
```ignorelang -----BEGIN PRIVATE KEY----- MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgWvjzcDbf9sMDtl31JnS2uCabzfHXDcYwXZP5ddyiRpqgCgYIKoEcz1UBgi2hRANCAATOxASdjgJXIhnJOF/bTZwE0mnK6BEGoJIOmFHQzpMbrlu+hoRIXOGX/pEtsZqJsKZLD99/iDjB5bM9y/f9GaEC -----END PRIVATE KEY----- ```
执行如下命令,查看EC密钥的信息:
```shell openssl ec -in sm2_private_key.pem -text ``` ```ignorelang read EC key Private-Key: (256 bit) priv: 5a:f8:f3:70:36:df:f6:c3:03:b6:5d:f5:26:74:b6: b8:26:9b:cd:f1:d7:0d:c6:30:5d:93:f9:75:dc:a2: 46:9a pub: 04:ce:c4:04:9d:8e:02:57:22:19:c9:38:5f:db:4d: 9c:04:d2:69:ca:e8:11:06:a0:92:0e:98:51:d0:ce: 93:1b:ae:5b:be:86:84:48:5c:e1:97:fe:91:2d:b1: 9a:89:b0:a6:4b:0f:df:7f:88:38:c1:e5:b3:3d:cb: f7:fd:19:a1:02 ASN1 OID: sm2p256v1 NIST CURVE: SM2 writing EC key -----BEGIN EC PRIVATE KEY----- MHcCAQEEIFr483A23/bDA7Zd9SZ0trgmm83x1w3GMF2T+XXcokaaoAoGCCqBHM9V AYItoUQDQgAEzsQEnY4CVyIZyThf202cBNJpyugRBqCSDphR0M6TG65bvoaESFzh l/6RLbGaibCmSw/ff4g4weWzPcv3/RmhAg== -----END EC PRIVATE KEY----- ```
后续可以正常执行转成DER命令:
```shell openssl pkcs8 -topk8 -inform PEM -outform DER -in sm2_private_key.pem -out sm2_private_key.der -nocrypt ```
父主题: 密钥管理类