数据加密服务 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签名时,如何计算SM3摘要?
使用SM2密钥签名时,仅支持对消息摘要签名。
根据GBT32918国家标准,计算SM2签名值时,消息摘要不是对原始消息直接计算SM3摘要,而是对Z(A)和M的拼接值计算的摘要。其中M是待签名的原始消息,Z(A)是GBT32918中定义的用户A的杂凑值。
以JAVA为例,参考如下示例代码:
public class Sm2SignDataPreprocessing { private static final String ECC_A = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC"; private static final String ECC_B = "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93"; private static final String ECC_GX = "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7"; private static final String ECC_GY = "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"; // 签名者ID,本示例使用国密标准定义的缺省值"1234567812345678" private static final String SM2_ID = "31323334353637383132333435363738"; public static void main(String[] args) throws Exception { // SM2公钥,BASE64编码格式,仅做示例,实际使用请替换 String sm2PubKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEsuOq/EjQeYUD9h7lIyqi3pQ6SWL7hTXjUJWmSIZAcnj" + "h9c0QcdbwzaCfI8iyyPCetX0QZl5NHrBoYLYxJpvbFg=="; byte[] pubKeyBytes = Base64.decodeBase64(sm2PubKey.getBytes(StandardCharsets.UTF_8)); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider()); ECPublicKey ecPublicKey = (ECPublicKey) keyFactory.generatePublic(keySpec); // 待签名的原始消息,仅做示例,实际使用请替换 byte[] dataToDigest = new byte[]{1, 2, 3, 4}; // Z(A)是GBT32918中定义的用户A的杂凑值 byte[] zsm = getSm2Z(ecPublicKey.getQ().getAffineXCoord().getEncoded(), ecPublicKey.getQ().getAffineYCoord().getEncoded()); // Z(A)和M的拼接值计算的摘要,并打印 byte[] dataToSign = getSm3SignData(zsm, dataToDigest); System.out.println(Base64.encodeBase64String(dataToSign)); // 其他语言实现或执行此示例应有如下输出:He+qiM2MmtNxlV/EB4vqkcP60XgG08z/8nWQdp/IS5c= } // 计算Z(A) private static byte[] getSm2Z(byte[] x, byte[] y) throws DecoderException { SM3Digest sm3 = new SM3Digest(); byte[] userId = Hex.decodeHex(SM2_ID.toCharArray()); byte[] byteEccA = Hex.decodeHex(ECC_A); byte[] byteEccB = Hex.decodeHex(ECC_B); byte[] byteEccGx = Hex.decodeHex(ECC_GX); byte[] byteEccGy = Hex.decodeHex(ECC_GY); int len = userId.length * 8; sm3.update((byte) (len >> 8 & 255)); sm3.update((byte) (len & 255)); sm3.update(userId, 0, userId.length); sm3.update(byteEccA, 0, byteEccA.length); sm3.update(byteEccB, 0, byteEccB.length); sm3.update(byteEccGx, 0, byteEccGx.length); sm3.update(byteEccGy, 0, byteEccGy.length); sm3.update(x, 0, x.length); sm3.update(y, 0, y.length); byte[] md = new byte[sm3.getDigestSize()]; sm3.doFinal(md, 0); return md; } // 计算Z(A)和M的拼接值的摘要 private static byte[] getSm3SignData(byte[] z, byte[] sourceData) { SM3Digest sm3 = new SM3Digest(); sm3.update(z, 0, z.length); sm3.update(sourceData, 0, sourceData.length); byte[] md = new byte[sm3.getDigestSize()]; sm3.doFinal(md, 0); return md; } }
父主题: 密钥管理类