swift RSA+AES加密插件CryptoSwift以及SwiftyRSA的使用

26 阅读2分钟

前言 一、SwiftyRSA介绍 二、CryptoSwift介绍 三、使用方法 1.引入库 2.SwiftyRSA插件RSA加密 2.SwiftyRSA插件RSA解密 3.CryptoSwift插件AES加密 4.CryptoSwift插件AES解密 总结

前言

一般APP通讯都要进行加密来保护数据 本文介绍了 swift 5.0 CryptoSwift 以及 SwiftyRSA 的使用。

举个栗子:

{“requestData”:“WsKJFYXD/678VaunPL6lJ41vmCqoQQk8mM6khEdA/o+BQYTdjSrT33foU6eiEwcrF7ZfhiMM3ukP1hpFHHFgyfvO9b9z+Jj8a2vtsHopG/w=”, “encrypted”:“B+rDLUA9jyFmV7ybpg2JA3N04CKKHijD3ji69JX3upoK1steRj4PrOAftvv2qaFmOVUEb5P0iU9QdDIi6Nlxd/HY1yuDNxW61SCBASVLfvfPu+0uk+/GneRGMISGweuaJhcASUorgjU2vgumZgnQRRdLnRQdzBuVK84BDeH+Xf0=”}

上面json数据的加密逻辑 : 1.随机生成16位 AES 加密密钥 aes_key 。 2.使用aes_key对要传输的真实数据进行AES加密得到requestData。 3.使用RSA公钥对aes_key进行RSA加密得到encrypted字段数据。

你需要的解密逻辑 1.使用RSA私钥对encrypted进行RSA解密,得到aes_key. 2.使用aes_key对requestData进行AES解密,得到最终真实数据result

一、SwiftyRSA介绍

github.com/TakeScoop/S… RSA加密的一款插件

二、CryptoSwift介绍

github.com/krzyzanowsk… swift 编写的一款综合加密插件,支持MD5,SHA,AES等各种加密

三、使用方法

1.引入库 代码如下(示例):

import SwiftyRSA import CryptoSwift

2.SwiftyRSA插件RSA加密 代码如下(示例):

///rsa加密
class func rsa_encrypt(_ str:String) -> String{
    var reslutStr = ""
    do{
        let rsa_publicKey = try PublicKey(pemEncoded: pubkey)
        let clear = try ClearMessage(string: str, using: .utf8)
        reslutStr = try clear.encrypted(with: rsa_publicKey, padding: .PKCS1).base64String 
         
    }catch{
        print("RSA加密失败")
    }
    return reslutStr;
}

2.SwiftyRSA插件RSA解密 代码如下(示例):

///rsa解密
class func rsa_decrypt(_ str:String) -> String{
    var reslutStr = ""
    let enData = Data(base64Encoded: str, options: .ignoreUnknownCharacters)!
    do{
        let rsa_privateKey = try PrivateKey(pemEncoded: privkey)
        let data = try EncryptedMessage(data: enData).decrypted(with: rsa_privateKey, padding: .PKCS1).data
        reslutStr = String(bytes: data.bytes, encoding: .utf8) ?? ""
    }catch{
        print("RSA解密失败")
    }
    return reslutStr
}

3.CryptoSwift插件AES加密 代码如下(示例):

   ///AES加密
class func aes_encrypt(_ str:String, aes_key:String) -> String{

    var encryptedStr = ""
    do {
        //  AES encrypt
        let encrypted = try AES(key: Array(aes_key.utf8), blockMode: ECB(), padding: .pkcs7).encrypt(str.bytes);
        let data = Data(base64Encoded: Data(encrypted), options: .ignoreUnknownCharacters)
        //加密结果从data转成string 转换失败  返回""
        encryptedStr = String(bytes: data!.bytes, encoding: .utf8) ?? ""
    } catch {
        print(error.localizedDescription)
    }
    return encryptedStr
}

没有测试,可能有base64编码的问题。

4.CryptoSwift插件AES解密 代码如下(示例):

 ///AES解密
class func aes_decrypt(_ str:String , aes_key:String) -> String{
    //decode base64
    let data = Data(base64Encoded: str, options: .ignoreUnknownCharacters)!
    
    var decrypted: [UInt8] = []
    do {
        // decode AES
        decrypted = try AES(key: Array(aes_key.utf8), blockMode: ECB(), padding: .pkcs7).decrypt(data.bytes);
    } catch {
        print(error.localizedDescription)
    }
    //解密结果从data转成string 转换失败  返回""
    return String(bytes: Data(decrypted).bytes, encoding: .utf8) ?? ""
}

总结

SwiftyRSA看看github文档就可以了,CryptoSwift文档中没有对字符串加解密的示例,所以需要自己从Array 转 String ,这里可能就有点懵逼。AES其中加密参数需要你和后台确定好比如说:模式( ECB ) 、填充方式(.pkcs7)。如果你用到了偏移量 iv ,那你可能需要使用AES的其他构造方法。