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
}
}
网友评论