当前位置: 首页 > 工具软件 > CryptoSwift > 使用案例 >

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

应和光
2023-12-01


前言

一般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介绍

https://github.com/TakeScoop/SwiftyRSA
RSA加密的一款插件

二、CryptoSwift介绍

https://github.com/krzyzanowskim/CryptoSwift
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<Uint8> 转 String ,这里可能就有点懵逼。AES其中加密参数需要你和后台确定好比如说:模式( ECB ) 、填充方式(.pkcs7)。如果你用到了偏移量 iv ,那你可能需要使用AES的其他构造方法。

 类似资料: