Проблема в том, что cKey
и cData
включают завершающий нулевой символ строк и в версии Swift, которая считается в cKey.count
и cData.count
, тогда как в версии Objective-C strlen(cKey)
и strlen(cData)
делают не считают завершающий нулевой символ строк.
Ведение
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.