在swift中使用KEK从TR31加密密钥块中提取密钥



我正试图在Swift中实现这个工作的python代码。基本上,它需要一个TR31密钥块,并使用kek从它打开密钥。这是提供正确密钥的工作Python代码(f039121bec83d26b169bdcd5b22aaf8f):

kek = "89E88CF7931444F334BD7547FC3F380C"
encryptedTR31KeyBlock = "A0096K0TD12S0100KS1800604B120F929280000015BE1EA22731B03647031CEA17F516A5B7B14FC7D08BAA4377B803E1"
header, decryptedKey = tr31.unwrap(bytes.fromhex(kek), encryptedTR31KeyBlock)
print(decryptedKey.hex())

我在Swift中尝试了以下操作,但它给出了一个CryptoKit.CryptoKitError.unwrapFailure:

let kekBytes2: [UInt8] = [
0x89, 0xE8, 0x8C, 0xF7, 0x93, 0x14, 0x44, 0xF3,
0x34, 0xBD, 0x75, 0x47, 0xFC, 0x3F, 0x38, 0x0C,
]
let kek = CryptoKit.SymmetricKey(data: Data(kekBytes2))
let encryptedTR31KeyBlock: [UInt8] = [
0x15, 0xBE, 0x1E, 0xA2, 0x27, 0x31, 0xB0, 0x36,
0x47, 0x03, 0x1C, 0xEA, 0x17, 0xF5, 0x16, 0xA5,
0xB7, 0xB1, 0x4F, 0xC7, 0xD0, 0x8B, 0xAA, 0x43,
]
//unwrap key
let unwrappedKey2 = try AES.KeyWrap.unwrap(encryptedTR31KeyBlock, using: kek)

TR31块分解:A0096K0TD12S0100KS1800604B120F9292800000(头)15 be1ea22731b03647031cea17f516a5b7b14fc7d08baa43(加密密钥)77年b803e1 (MAC)

我是这个Python库的作者。当TR-31钥匙块被打开时,还有很多事情要做。而描述它就是描述整个TR-31规范。

那么,这里你做错了:

  1. TR-31密钥块不是苹果实现的aes封装https://developer.apple.com/documentation/cryptokit/aes/keywrap
  2. 您在那里得到的密钥块使用(已弃用)基于变体的DES方法。不是AES。

你可以看看这个库做了什么,然后在swift中忠实地重新实现它,它应该可以工作。