了解加密與簽名數(shù)據(jù)的格式,可以幫助您解讀加密和簽名信息。

加密數(shù)據(jù)格式

  • 加密SDK(Encryption SDK)加密數(shù)據(jù)結(jié)果
    加密數(shù)據(jù)結(jié)果 組成部分 說明
    消息頭 版本 當前版本值為1。
    算法

    更多信息,請參見算法

    數(shù)據(jù)密鑰列表
    數(shù)據(jù)密鑰列表由1到多個數(shù)據(jù)密鑰組成,數(shù)據(jù)密鑰分為以下兩部分:
    • 用戶主密鑰資源名稱(Aliyun Resource Name ARN):格式為acs:kms:RegionId:UserId:key/CmkId,包含地域信息、用戶ID、用戶主密鑰ID。
    • 數(shù)據(jù)密鑰密文:數(shù)據(jù)密鑰被指定CMK的主版本加密后的密文,調(diào)用GenerateDataKey返回的CipherBlob。
    加密上下文 加密上下文數(shù)據(jù),作為對稱加密算法的額外認證數(shù)據(jù)。
    頭部認證初始向量 計算頭部認證信息的初始向量值,為隨機數(shù)。
    頭部認證信息 通過GMAC計算頭部認證信息,校驗失敗時返回加密消息格式異常。
    消息體 初始向量 初始化向量IV(initialization vector)是一個固定長度的輸入值。一般為隨機數(shù)或偽隨機數(shù)(pseudo random)。
    密文 數(shù)據(jù)加密的結(jié)果。
    認證數(shù)據(jù) GCM(Galois Counter Mode)模式返回的認證數(shù)據(jù),用于校驗數(shù)據(jù)的完整性,完整性校驗失敗時返回解密失敗。

    消息頭中的算法詳情如下表所示:

    算法號 算法信息 算法 工作模式 密鑰長度(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字節(jié)的認證數(shù)據(jù)。
  • 加密數(shù)據(jù)結(jié)果格式定義

    加密數(shù)據(jù)結(jié)果使用ASN.1進行編碼,加密數(shù)據(jù)結(jié)果格式的ASN.1定義如下:

    EncryptionMessage ::== SEQUENCE {
        encryptionHead        EncryptionHead           --消息頭
        encryptionBody        EncryptionBody           --消息體
    }
    
    EncryptionHead ::== SEQUENCE {
        version               INTEGER                  --版本
        algorithm             INTEGER                  --算法
        encryptedDataKeys     SET EncryptedDataKey     --數(shù)據(jù)密鑰列表
        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            --數(shù)據(jù)密鑰加密后的密文
    }
    
    EncryptionContext ::== SEQUENCE {
        key                   OCTECT STRING
        value                 OCTECT STRING
    }
  • 加密數(shù)據(jù)結(jié)果示例
    SEQUENCE (2 elem)
      SEQUENCE (6 elem)
        INTEGER 1                                                       // 版本
        INTEGER 2                                                       // 算法
        SET (2 elem)                                                    // 數(shù)據(jù)密鑰列表
          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          // 頭部認證數(shù)據(jù)
      SEQUENCE (3 elem)                                                  // 加密消息
        OCTET STRING (12 byte) EF49E2CBB768A7AD0FB0FE20                  // 初始向量
        OCTET STRING (13 byte) 89A4AB43CD793F7711767C491A                // 密文
        OCTET STRING (16 byte) 2E93DA019B7A6507155BA3AA252750E3          // 認證數(shù)據(jù)
  • 加密數(shù)據(jù)結(jié)果長度
    • (108B+77B)*CMK數(shù)量
      說明 108B表示CMK的ARN長度為108字節(jié),77B表示GenerateDataKey返回的CipherBlob長度為77字節(jié)。
    • 加密上下文長度
    • ASN1編碼30B
      說明 30B表示ASN1編碼的類型和長度為30字節(jié)。
    • 密文長度
    • 初始向量
    • 認證信息

簽名數(shù)據(jù)格式

加密SDK的簽名運算調(diào)用阿里云密鑰管理服務(wù)的非對稱簽名接口AsymmetricSign,返回簽名值對應(yīng)的二進制數(shù)據(jù)。