Swift

CBC 加密解密

2023-01-29  本文已影响0人  小奉不在乎
import Foundation
import CryptoKit
import CommonCrypto

class PTECKeyUtil: NSObject {
    
    static let share = PTECKeyUtil()
    
    /// 在X25519上执行椭圆曲线Diffie-Hellmann密钥协议。
    open class func getShareKey(from peerPubKey: Data, privateKey: Curve25519.KeyAgreement.PrivateKey) throws -> SharedSecret {
        let theirKey = try Curve25519.KeyAgreement.PublicKey(rawRepresentation: peerPubKey)
        return try privateKey.sharedSecretFromKeyAgreement(with: theirKey)
    }
    
    // MARK: cbc 加密
    /// cbc 加密
    open class func encryptCBCMode(_ data: Data, key: Data, iv: Data) -> Data? {
        
        let input_bytes = data.bytes
        let key_bytes = key.bytes
        let iv_bytes = iv.bytes
        
        var encrypt_length = input_bytes.count + kCCBlockSizeAES128
        var encrypt_bytes = [UInt8](repeating: 0, count: encrypt_length)
        // 加密解密不同的地方 加密是:kCCEncrypt  解密是kCCDecrypt
        let status = CCCrypt(UInt32(kCCEncrypt), UInt32(kCCAlgorithmAES128), UInt32(kCCOptionPKCS7Padding),
                             key_bytes, key.count,
                             iv_bytes,
                             input_bytes, input_bytes.count,
                             &encrypt_bytes, encrypt_bytes.count,
                             &encrypt_length)
        if status == Int32(kCCSuccess) {
            return Data.init(bytes: encrypt_bytes, count: encrypt_length)
        } else {
            PTLog("加密密失败")
        }
        return nil
    }
    
    
    // MARK: cbc 解密
    /// cbc 解密
    open class func decryptCBCMode(_ data: Data, key: Data, iv: Data) -> Data? {

        let input_bytes = data.bytes
        let key_bytes = key.bytes
        let iv_bytes = iv.bytes
        
        var encrypt_length = input_bytes.count + kCCBlockSizeAES128
        var encrypt_bytes = [UInt8](repeating: 0, count: encrypt_length)
        
        let status = CCCrypt(UInt32(kCCDecrypt), UInt32(kCCAlgorithmAES128), UInt32(kCCOptionPKCS7Padding),
                             key_bytes, key.count,
                             iv_bytes,
                             input_bytes, input_bytes.count,
                             &encrypt_bytes, encrypt_bytes.count,
                             &encrypt_length)
        if status == Int32(kCCSuccess) {
            return Data.init(bytes: encrypt_bytes, count: encrypt_length)
        } else {
            PTLog("解密失败")
        }
        return nil
    }
}

上一篇 下一篇

猜你喜欢

热点阅读