问题是cKey
and cData
包括字符串的终止空字符,并且在 Swift 版本中计入cKey.count
and cData.count
,而在 Objective-C 版本中strlen(cKey)
and strlen(cData)
do not计算字符串的终止空字符。
Doing
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), cKey, strlen(key), cData, strlen("message", &digest)
相反,可以解决示例中的问题,但对于非 ASCII 字符来说不安全。
我实际上要做的是将字符串转换为Data
具有 UTF-8 表示形式的值(不包括终止空字节)。然后将底层字节缓冲区传递给加密方法:
let key = "1234567890123456789012345678901234567890123456789012345678901234"
let cKey = Data(key.utf8)
let cData = Data("message".utf8)
var digest = [CUnsignedChar](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
cKey.withUnsafeBytes { keyPtr in
cData.withUnsafeBytes { dataPtr in
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), keyPtr.baseAddress, cKey.count, dataPtr.baseAddress, cData.count, &digest)
}
}
let hash = Data(digest)
let encryptedString = hash.base64EncodedString()
这会产生相同的结果ZNjnsz2Uv5L0PvWIJjSh0BrOovuRXOSFWQ0s1Rd8VSM=
作为您的 Objective-C 代码。