Swift里Data的压缩zip、unzip, AES、MD5加

2023-06-29  本文已影响0人  独孤流

参考:

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

使用NSData+zlib进行zip、unzip操作
使用CryptoSwift进行md5、AES、SHA
使用SwiftyRSA进行RSA


import Foundation
import GoogleUtilities
import CryptoSwift
import SwiftyRSA

class DataCryptTool {
    static func test() {
        let data = "123456".data(using: .utf8)
        let data1 = data?.gzip
        let data2 = data1?.gUnZip
        let data3 = data?.AESCrypt(key: "1234567890123456", padding: .pkcs5Padding, isEncode: true)
        let data4 = data3?.AESCrypt(key: "1234567890123456", padding: .pkcs5Padding, isEncode: false)
        print(data?.bString ?? "")
        print(data1?.bString ?? "")
        print(data2?.bString ?? "")
        print(data3?.bString ?? "")
        print(data4?.bString ?? "")
    }
}
enum AESPaddingType {
    case pkcs7Padding
    case pkcs5Padding
    
    var aesVal: CryptoSwift.Padding {
        switch self {
        case .pkcs5Padding:
            return .pkcs5
        case .pkcs7Padding:
            return .pkcs7
        }
    }
}
extension Data {
    var gzip: Data? {
        do {
            let result =  try NSData.gul_data(byGzippingData: self)
            return result
        } catch let error {
            print(error)
        }
        return nil
    }
    var gUnZip: Data? {
        do {
            let result =  try NSData.gul_data(byInflatingGzippedData: self)
            return result
        } catch let error {
            print(error)
        }
        return nil
    }
    // AES/ECB/Padding7
    // AES/ECB/Padding5
    func AESCrypt(key: String, padding: AESPaddingType, isEncode: Bool) -> Data? {
        do {
            let setting = try AES(key: key.bytes, blockMode: ECB(), padding: padding.aesVal)
            let result = try isEncode ? setting.encrypt(self.bytes) : setting.decrypt(self.bytes)
            return result.data
        } catch let error {
            print(error)
        }
        return nil
    }
    public typealias RSAPadding = SecPadding
    static func RSACrypt(val: String, key: String, padding: RSAPadding, isEncode: Bool) -> String? {
        guard let keyData = key.data(using: .utf8) else {
            return nil
        }
        do {
            if isEncode {
                // 公钥加密
                let publicKey = try PublicKey(base64Encoded: key)
                let message = try ClearMessage(string: val, using: .utf8)
                let data = try message.encrypted(with: publicKey, padding: padding)
                return data.base64String
            } else {
                // 私钥解密
                let privateKey = try PrivateKey(base64Encoded: key)
                let message = try EncryptedMessage(base64Encoded: val)
                let data = try message.decrypted(with: privateKey, padding: padding)
                return data.base64String
            }
        } catch let error {
            print(error)
        }
        return nil
    }
}


上一篇 下一篇

猜你喜欢

热点阅读