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


前言

一般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的其他构造方法。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
双向 RSA + AES 加密是一种常见的加密方式,其中使用 RSA 算法加密 AES 密钥,然后使用 AES 算法加密数据。在 C# 中,可以使用 `RSACryptoServiceProvider` 类和 `AesCryptoServiceProvider` 类来实现此加密方式。以下是一个简单的示例: ```csharp using System; using System.IO; using System.Security.Cryptography; using System.Text; class Program { static void Main(string[] args) { string plainText = "Hello, world!"; byte[] encryptedData = Encrypt(plainText); string decryptedText = Decrypt(encryptedData); Console.WriteLine("Original text: {0}", plainText); Console.WriteLine("Encrypted data: {0}", Convert.ToBase64String(encryptedData)); Console.WriteLine("Decrypted text: {0}", decryptedText); } static byte[] Encrypt(string plainText) { byte[] aesKey = GenerateAesKey(); using (var rsa = new RSACryptoServiceProvider()) { rsa.PersistKeyInCsp = false; byte[] encryptedAesKey = rsa.Encrypt(aesKey, true); // 使用 RSA 加密 AES 密钥 using (var aes = new AesCryptoServiceProvider()) { aes.Key = aesKey; aes.GenerateIV(); using (var memoryStream = new MemoryStream()) { memoryStream.Write(aes.IV, 0, aes.IV.Length); using (var cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write)) { byte[] plainData = Encoding.UTF8.GetBytes(plainText); cryptoStream.Write(plainData, 0, plainData.Length); cryptoStream.FlushFinalBlock(); } byte[] encryptedData = memoryStream.ToArray(); byte[] result = new byte[encryptedAesKey.Length + encryptedData.Length]; Buffer.BlockCopy(encryptedAesKey, 0, result, 0, encryptedAesKey.Length); Buffer.BlockCopy(encryptedData, 0, result, encryptedAesKey.Length, encryptedData.Length); return result; } } } } static string Decrypt(byte[] encryptedData) { byte[] encryptedAesKey = new byte[128]; // RSA 加密 AES 密钥得到的密文长度为 128 字节 byte[] encryptedDataOnly = new byte[encryptedData.Length - encryptedAesKey.Length]; Buffer.BlockCopy(encryptedData, 0, encryptedAesKey, 0, encryptedAesKey.Length); Buffer.BlockCopy(encryptedData, encryptedAesKey.Length, encryptedDataOnly, 0, encryptedDataOnly.Length); using (var rsa = new RSACryptoServiceProvider()) { rsa.PersistKeyInCsp = false; byte[] aesKey = rsa.Decrypt(encryptedAesKey, true); // 使用 RSA 解密 AES 密钥 using (var aes = new AesCryptoServiceProvider()) { aes.Key = aesKey; aes.IV = encryptedDataOnly.Take(aes.IV.Length).ToArray(); using (var memoryStream = new MemoryStream()) { using (var cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Write)) { cryptoStream.Write(encryptedDataOnly, aes.IV.Length, encryptedDataOnly.Length - aes.IV.Length); cryptoStream.FlushFinalBlock(); } byte[] decryptedData = memoryStream.ToArray(); return Encoding.UTF8.GetString(decryptedData); } } } } static byte[] GenerateAesKey() { using (var aes = new AesCryptoServiceProvider()) { aes.GenerateKey(); return aes.Key; } } } ``` 上面的代码中,首先调用 `GenerateAesKey` 方法生成 AES 密钥,然后使用 RSA 算法加密 AES 密钥。加密时,先将 AES 密钥使用 RSA 加密,然后使用 AES 算法加密数据。具体来说,将 AES 密钥和 IV 都写入 `MemoryStream` 对象中,然后使用 `CryptoStream` 对象将数据写入 `MemoryStream` 对象中。最后将密文和 RSA 加密的 AES 密钥一起返回。 解密时,先从密文中取出 RSA 加密的 AES 密钥,然后使用 RSA 算法解密 AES 密钥。解密时,先从密文中取出 AES 的 IV 值,然后使用 `CryptoStream` 对象将数据解密。最后将解密后的文本返回。 注意,上面的示例仅用于演示 RSA + AES 加密的基本原理,实际使用中还需要考虑安全性等因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值