了解加密與簽名數(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ù)。 - 用戶主密鑰資源名稱(Aliyun Resource Name ARN):格式為
- 加密數(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é)。
- 密文長度
- 初始向量
- 認證信息
- (108B+77B)*CMK數(shù)量
簽名數(shù)據(jù)格式
加密SDK的簽名運算調(diào)用阿里云密鑰管理服務(wù)的非對稱簽名接口AsymmetricSign,返回簽名值對應(yīng)的二進制數(shù)據(jù)。