Swift中如何通过OpenSSL的RIPEMD160获取指定格式哈希值
iOS OpenSSL RIPEMD160 哈希字节转十六进制字符串实现
核心逻辑
调用RIPEMD160得到的20字节UInt8数组,只需要逐位转换为两位的十六进制字符,拼接后就是你需要的哈希字符串。
另外你当前的测试代码存在两处可优化/修正的点:
- 计算公钥HASH160(SHA256+RIPEMD160)时,应该直接使用SHA256输出的原始32字节二进制数据作为RIPEMD160的输入,不需要先转成十六进制字符串再取UTF8编码,会导致计算结果错误
- RIPEMD160 C函数的第二个参数是输入数据的字节长度,不能直接写死为RIPEMD160_DIGEST_LENGTH
字节转十六进制字符串工具实现
可以通过Swift扩展实现通用的字节数组转十六进制方法:
extension Sequence where Element == UInt8 { /// 转换为小写十六进制字符串 var hexString: String { return self.map { String(format: "%02hhx", $0) }.joined() } /// 转换为大写十六进制字符串 var hexStringUppercased: String { return self.map { String(format: "%02hhX", $0) }.joined() } }
修正后的完整测试代码
import CryptoKit // 用于SHA256计算,你也可以用OpenSSL的SHA256实现 // 此处需保证你已正确引入OpenSSL的RIPEMD160相关头文件 let publicKey = "04981891480BC21B0AFE20FAF8F49FB1618E80769D0956A730B8409E856CB9512B4778CB346C211065050E008412C29B0474EA56AEA3761DBD75655B4FBD252E39" // 1. 把公钥十六进制字符串转成原始二进制字节 guard let pubKeyData = Data(hexString: publicKey) else { fatalError("公钥格式错误") } // 2. 计算公钥的SHA256原始字节 let sha256Data = SHA256.hash(data: pubKeyData) let sha256Bytes = [UInt8](sha256Data) // 3. 计算SHA256结果的RIPEMD160哈希 var ripemd160Bytes = [UInt8](repeating: 0, count: Int(RIPEMD160_DIGEST_LENGTH)) _ = sha256Bytes.withUnsafeBufferPointer { buf in RIPEMD160(buf.baseAddress, sha256Bytes.count, &ripemd160Bytes) } // 4. 转换为你需要的十六进制字符串 let ripemd160Hex = ripemd160Bytes.hexString print(ripemd160Hex) // 输出格式即为你需要的40位十六进制哈希字符串
如果你的项目没有现成的十六进制字符串转Data的实现,可以用以下扩展:
extension Data { init?(hexString: String) { let len = hexString.count / 2 var data = Data(capacity: len) var index = hexString.startIndex for _ in 0..<len { let nextIndex = hexString.index(index, offsetBy: 2) guard let byte = UInt8(hexString[index..<nextIndex], radix: 16) else { return nil } data.append(byte) index = nextIndex } self = data } }
内容的提问来源于stack exchange,提问作者Nickey Production
相关产品推荐
相关产品推荐

