了解加密与签名数据的格式,可以帮助您解读加密和签名信息。
加密数据格式
- 加密SDK(Encryption SDK)加密数据结果
加密数据结果 组成部分 说明 消息头 版本 当前版本值为1。 算法 更多信息,请参见算法。
数据密钥列表 数据密钥列表由1到多个数据密钥组成,数据密钥分为以下两部分:- 用户主密钥资源名称(Aliyun Resource Name ARN):格式为
acs:kms:RegionId:UserId:key/CmkId
,包含地域信息、用户ID、用户主密钥ID。 - 数据密钥密文:数据密钥被指定CMK的主版本加密后的密文,调用GenerateDataKey返回的CipherBlob。
加密上下文 加密上下文数据,作为对称加密算法的额外认证数据。 头部认证初始向量 计算头部认证信息的初始向量值,为随机数。 头部认证信息 通过GMAC计算头部认证信息,校验失败时返回加密消息格式异常。 消息体 初始向量 初始化向量IV(initialization vector)是一个固定长度的输入值。一般为随机数或伪随机数(pseudo random)。 密文 数据加密的结果。 认证数据 GCM(Galois Counter Mode)模式返回的认证数据,用于校验数据的完整性,完整性校验失败时返回解密失败。 消息头中的算法详情如下表所示:
算法号 算法信息 算法 工作模式 密钥长度(bit) 初始向量长度(Byte) 1 AES_GCM_NOPADDING_128 AES GCM 128 12 2 AES_GCM_NOPADDING_256 AES GCM 256 12 3 AES_CBC_NOPADDING_128 AES CBC 128 16 4 AES_CBC_NOPADDING_256 AES CBC 256 16 5 AES_CBC_PKCS5_128 AES CBC 128 16 6 AES_CBC_PKCS5_256 AES CBC 256 16 7 AES_CTR_NOPADDING_128 AES CTR 128 16 8 AES_CTR_NOPADDING_256 AES CTR 256 16 9 SM4_GCM_NOPADDING_128 SM4 GCM 128 16 10 SM4_CBC_NOPADDING_128 SM4 CBC 128 16 11 SM4_CBC_PKCS5_128 SM4 CBC 128 16 12 SM4_CTR_NOPADDING_128 SM4 CTR 128 16 说明 仅AES_GCM_NOPADDING_128、AES_GCM_NOPADDING_256和SM4_GCM_NOPADDING_128包含16字节的认证数据。 - 用户主密钥资源名称(Aliyun Resource Name ARN):格式为
- 加密数据结果格式定义
加密数据结果使用ASN.1进行编码,加密数据结果格式的ASN.1定义如下:
EncryptionMessage ::== SEQUENCE { encryptionHead EncryptionHead --消息头 encryptionBody EncryptionBody --消息体 } EncryptionHead ::== SEQUENCE { version INTEGER --版本 algorithm INTEGER --算法 encryptedDataKeys SET EncryptedDataKey --数据密钥列表 encryptionContext SET EncryptionContext --加密上下文 headerIv OCTECT STRING --头部认证初始向量 headerAuthTag OCTECT STRING --头部认证信息 } EncryptionBody ::== SEQUENCE{ iv OCTECT STRING --初始向量 cipherText OCTECT STRING --密文 authTag OCTECT STRING --GCM认证信息 } EncryptedDataKey ::== SEQUENCE { cmkArn OCTECT STRING --KMS用户主密钥的ARN encryptedDataKey OCTECT STRING --数据密钥加密后的密文 } EncryptionContext ::== SEQUENCE { key OCTECT STRING value OCTECT STRING }
- 加密数据结果示例
SEQUENCE (2 elem) SEQUENCE (6 elem) INTEGER 1 // 版本 INTEGER 2 // 算法 SET (2 elem) // 数据密钥列表 SEQUENCE (2 elem) OCTET STRING (77 byte) acs:kms:cn-beijing:1540355698xxxxx:key/2fad5f44-9573-4f28-8956-xxxx… OCTET STRING (108 byte) 36613739356232362D626163642xxxx262642D383630612D323563313839316131663… SEQUENCE (2 elem) OCTET STRING (77 byte) acs:kms:cn-hangzhou:1540355698xxxxx:key/f6d61352-82bb-450a-b105-xxxx… OCTET STRING (108 byte) 62623630646439352D343165302xxxx237382D616233332D356262636136643633643… SET (5 elem) // 加密上下文集合 SEQUENCE (2 elem) OCTET STRING (11 byte) encryption OCTET STRING (7 byte) context SEQUENCE (2 elem) OCTET STRING (7 byte) is not OCTET STRING (6 byte) secret SEQUENCE (2 elem) OCTET STRING (9 byte) but adds OCTET STRING (15 byte) useful metadata SEQUENCE (2 elem) OCTET STRING (18 byte) that can help you OCTET STRING (17 byte) be confident that SEQUENCE (2 elem) OCTET STRING (26 byte) the data you are handling OCTET STRING (23 byte) is what you think it is OCTET STRING (12 byte) E66C1CE19C79F3FBCD62858D // 头部认证初始向量 OCTET STRING (16 byte) CEEC46C65670E82CD78028AC0104D083 // 头部认证数据 SEQUENCE (3 elem) // 加密消息 OCTET STRING (12 byte) EF49E2CBB768A7AD0FB0FE20 // 初始向量 OCTET STRING (13 byte) 89A4AB43CD793F7711767C491A // 密文 OCTET STRING (16 byte) 2E93DA019B7A6507155BA3AA252750E3 // 认证数据
- 加密数据结果长度
- (108B+77B)*CMK数量
说明 108B表示CMK的ARN长度为108字节,77B表示GenerateDataKey返回的CipherBlob长度为77字节。
- 加密上下文长度
- ASN1编码30B
说明 30B表示ASN1编码的类型和长度为30字节。
- 密文长度
- 初始向量
- 认证信息
- (108B+77B)*CMK数量
签名数据格式
加密SDK的签名运算调用阿里云密钥管理服务的非对称签名接口AsymmetricSign,返回签名值对应的二进制数据。