了解加密与签名数据的格式,可以帮助您解读加密和签名信息。

加密数据格式

  • 加密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字节的认证数据。
  • 加密数据结果格式定义

    加密数据结果使用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字节。
    • 密文长度
    • 初始向量
    • 认证信息

签名数据格式

加密SDK的签名运算调用阿里云密钥管理服务的非对称签名接口AsymmetricSign,返回签名值对应的二进制数据。