Мне нужно заново реализовать для iOS (swift) криптографическую операцию, выполненную для приложения Android (kotlin) благодаря библиотеке bouncycastle.Код kotlin:
val mac = "9D3391051A4E774B".hexStringToByteArray()
val macKey = "89D7B23D500D492FA01DC53B44864AB8".hexStringToByteArray()
val cipheredData = "E77A914D5C94A04B6D8E10BA7A56A015AC2C40167F867A97B6349F29F3100D6D".hexStringToByteArray()
var macBlock = CBCBlockCipherMac(AESEngine(), ISO7816d4Padding())
macBlock.init(KeyParameter(macKey))
macBlock.update(cipheredData, 0, cipheredData.size)
var output = ByteArray(8)
macBlock.doFinal(output, 0)
if(output.toHex() == mac.toHex()) {
print("equals !!")
} else {
print("not equals : ${output.toHex()}")
}
Этот код работает, найденный mac из вывода совпадает с исходным свойством mac.
Я пытался использовать swift Library CryptoSwift с этим кодом:
let mac = Data(hex: "9D3391051A4E774B")
let macKey = Data(hex: "89D7B23D500D492FA01DC53B44864AB8")
let cipheredData = Data(hex: "E77A914D5C94A04B6D8E10BA7A56A015AC2C40167F867A97B6349F29F3100D6D")
do {
var output = try CBCMAC(key: macKey.bytes).authenticate(cipheredData.bytes)
checkOutput(mac: mac, output: output)
} catch {
debugPrint("Exception \(error)")
}
Но это не работает.Алгоритм, лежащий в основе класса CBCMAC CryptoSwift, работает не так, как CBCBlockCipherMac от bouncycastle.
Я также пытался использовать библиотеку Apple CommonCrypto, но нет аутентификации CBCMAC, только HMAC.Я не нашел способа легко выполнить CBC-MAC-аутентификацию для платформы iOS.