【问题标题】:MD5 of an UTF16LE (without BOM and 0-Byte End) in SwiftSwift 中 UTF16LE(无 BOM 和 0 字节结尾)的 MD5
【发布时间】: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”使用它。

标签: ios swift md5


【解决方案1】:

这个

let str = "1234567z" + "-" + "äbc"
let data = str.data(using: .utf16LittleEndian)!

已经给出了您想要计算的 UTF16LE 数据 MD5哈希,不需要过滤掉0字节或其他任何操作。

改为将函数从 How to convert string to MD5 hash using ios swift 修改为采用 Data 参数 而不是String:

func MD5(messageData: Data) -> Data {
    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
}

以便您可以使用已转换的数据调用它:

let str = "1234567z" + "-" + "äbc"
let data = str.data(using: .utf16LittleEndian)!

let md5Data = MD5(messageData: data)
let md5Hex =  md5Data.map { String(format: "%02hhx", $0) }.joined()

print("md5Hex: \(md5Hex)")
// 9e224a41eeefa284df7bb0f26c2913e2

【讨论】:

  • 太棒了!非常感谢您,特别是您的解释。
  • @SergejD.:不客气! –(请注意,如果有帮助,您可以接受答案,点击复选标记,比较stackoverflow.com/help/someone-answers.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2015-07-18
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 2020-03-21
相关资源
最近更新 更多