一般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
https://github.com/TakeScoop/SwiftyRSA
RSA加密的一款插件
https://github.com/krzyzanowskim/CryptoSwift
swift 编写的一款综合加密插件,支持MD5,SHA,AES等各种加密
代码如下(示例):
import SwiftyRSA
import CryptoSwift
代码如下(示例):
///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;
}
代码如下(示例):
///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
}
代码如下(示例):
///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编码的问题。
代码如下(示例):
///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的其他构造方法。