Swift Sha512加密(翻译Kotlin代码)

Swift Sha512 Encryption ( translate Kotlin code )

这是 Kotlin 代码:

private fun verify(inputDataToVerify: String, signature: String): Boolean {
    return try {
        val pubKey = "XXXMYPUBKEYXXX"
        val bytesFromPropFile = pubKey.toByteArray()
        val keySpec = X509EncodedKeySpec(Base64.decode(bytesFromPropFile, Base64.DEFAULT))
        val keyFactory = KeyFactory.getInstance("RSA")
        val publicKey = keyFactory.generatePublic(keySpec)
        Signature.getInstance("SHA512WithRSA").run {
            initVerify(publicKey)
            update(inputDataToVerify.toByteArray())
            verify(Base64.decode(signature.toByteArray(), Base64.DEFAULT))
        }
    } catch (ex: Exception) {
        Timber.e(ex)
        false
    }
}

我必须将这段代码转换为 Swift,因为我的 iOS 应用程序需要相同的行为,但我对加密真的很陌生。 我能怎么做?我需要第三方库?

您不需要加密任何东西,您需要验证签名。这些算法是:

  • SubjectPublicKeyInfospki 用于 public 密钥(如 X509 证书标准中所定义,因此得名);
  • 旧的RSA/PKCS#1签名验证算法(显然是用SHA-512作为哈希算法)。

请注意,toByteArray() 默认使用 UTF-8 将字符串编码为二进制。显然在 base 64 解码之前不应该真的需要它,但是是的...

我找到了 SwiftyRSA 的解决方案,这就是方法

private func verifySignature(inputDataToVerify: String, signature: String) -> Bool{
    
    let pubKeyString = environmentService.getNexiPubKey()
    
    do {
        let publicKey = try PublicKey(pemEncoded: pubKeyString)
        let clear = try ClearMessage(string: inputDataToVerify, using: .utf8)
        let sign = try Signature(base64Encoded: signature)
        let isSuccessfull = try clear.verify(with: publicKey, signature: sign, digestType: .sha512)
        
        return isSuccessfull
    }
    catch let error{
        print(error)
        return false
    }

}