【发布时间】:2023-03-12 21:00:01
【问题描述】:
我遇到了和这个帖子完全相同的问题:
MD5 of an UTF16LE (without BOM and 0-Byte End) in C#
但是,我试图在基于 Swift 4 的 iOS 应用程序中实现这一点。我尝试了
中讨论的所有选项How to convert string to MD5 hash using ios swift
还有https://github.com/krzyzanowskim/CryptoSwift
但我无法生成正确的 MD5 哈希。我生成了输入字符串的字节数组,并删除了字符串末尾的 0 字节,并使用了上面线程中提到的函数。如果有人可以请指出我正确的方向。 基本上utf8字符串“1234567z-äbc”应该变成“9e224a41eeefa284df7bb0f26c2913e2”
这就是我到目前为止所尝试的:
let str = "1234567z" + "-" + "äbc"
let data = str.data(using: .utf16LittleEndian)!
let bytesArray = data.map { $0 }
let bytesArrayNoZero = bytesArray.filter{ $0 != 0}
let str2 = String(bytes: bytesArrayNoZero, encoding: String.Encoding.utf16LittleEndian)
print (fritz_01.MD5(str2!))
func MD5(string: String) -> Data {
let messageData = string.data(using:.utf8)!
var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))
_ = digestData.withUnsafeMutableBytes {digestBytes in
messageData.withUnsafeBytes {messageBytes in
CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
}
}
return digestData
}
【问题讨论】:
-
最好避免使用 CryptoSwift,除此之外,它比基于 Common Crypto 的实现慢 500 到 1000 倍。 Apple 的 Common Crypto 已通过 FIPS 认证,因此经过了严格的审查,使用 CryptoSwift 在正确性和安全性(例如定时和功率攻击)方面是有机会的。
-
MD5 of "1234567z-äbc" using utf-8 of is: hex
935fe44e659beb5a3bb7a4564fba0513。 “ä”的 UTF 是十六进制字节C384。 MD5 是十六进制11d8b9e9ff20d10a1925d3b5f15b6e6d。十六进制9e224a41eeefa284df7bb0f26c2913e2来自哪里?为什么使用 utf-16?当需要字节时,一般使用 utf-8。 -
谢谢,使用 utf-16 little endian 不是我的主意...我正在开发一个小应用程序来通过我的家庭路由器 (AVM FritzBox) 控制我的一些局域网设备。这是需要 utf-16 little endian 的 AVM 质询响应过程的文档:avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/… 在边节点上:我确实使用了 Apple 的 Common Crypto 库。我使用桥接头文件 (#import
) 导入了它。上面提到的函数“MD5”使用它。