ios - 相当于 bouncycaSTLe 的 CBCBlockCipherMac for swift

标签 ios swift cryptography bouncycastle cbc-mac

由于 bouncycaSTLe 的库,我需要为 iOS (swift) 重新实现为 Android 应用程序 (kotlin) 完成的加密操作。 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)")
}

但这行不通。 CryptoSwift 的 CBCMAC 类背后的算法与 bouncycaSTLe 的 CBCBlockCipherMac 不同。

我也尝试过使用苹果的 CommonCrypto 库,但没有 CBCMAC 身份验证,只有 HMAC。我没有找到任何方法可以轻松地为 iOS 平台进行 CBC-MAC 身份验证。

最佳答案

我找到了一个解决方案,在 CryptoSwift 类中开发真正的 CBC-MAC 加密:

public func authenticate(_ cipheredBytes: Array<UInt8>, padding: Padding, blockSize: Int) throws -> Array<UInt8> {
    var inBytes = cipheredBytes
    bitPadding(to: &inBytes, blockSize: blockSize)
    let blocks = inBytes.chunked(into: blockSize)

    var lastBlockEncryptionResult : [UInt8] = CBCMAC.Zero
    try blocks.forEach { (block) in
        let aes = try AES(key: Array(key), blockMode: CBC(iv: lastBlockEncryptionResult), padding: padding)
        lastBlockEncryptionResult = try aes.encrypt(block)
    }

    return lastBlockEncryptionResult
}

用我的初始参数调用它给出了答案:

9d3391051a4e774b7572fb9bca51dc51

所以前 8 位是好的。

关于ios - 相当于 bouncycaSTLe 的 CBCBlockCipherMac for swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58029479/

相关文章:

json - 完成数据加载后不会删除 swift activityIndi​​cator

ios - 从 NSArray 中获取具有 CoreData 内容的字段

objective-c - 发布版本中 rawValue 的重新声明无效

python - AES 256 字节以外(8 或 16)

iphone - 新版本App内购

ios - Swift 膨胀 [UInt8] 无法使用 miniz lib 缩小

ios - OpenGL ES 2.0 光线拾取,远点

ios - 不兼容的指针类型用类型为 'NSString *' 的表达式初始化 'UITextField *'

java - 在另一台设备上使用 EasyCrypt 库完成密码时出错

python - Python 6 库的导入问题