102 lines
2.8 KiB
Swift
102 lines
2.8 KiB
Swift
//// CryptorService.swift
|
||
// QJDrama
|
||
//
|
||
// Created by Yao on 2025/4/16
|
||
//
|
||
//
|
||
|
||
import Foundation
|
||
|
||
class CryptorService {
|
||
// 定义常量
|
||
static let EN_STR_TAG: String = "$" // 替换为实际的加密标记
|
||
|
||
// 解密字符串
|
||
static func decrypt(data: String) -> String {
|
||
guard data.hasPrefix(EN_STR_TAG) else {
|
||
// fatalError("Invalid encoded string")
|
||
return data
|
||
}
|
||
|
||
let decryptedData = deStrBytes(data: data)
|
||
return String(data: decryptedData, encoding: .utf8) ?? ""
|
||
}
|
||
|
||
// 从十六进制字符串解密字节
|
||
static func deStrBytes(data: String) -> Data {
|
||
|
||
let hexData = String(data.dropFirst())
|
||
var bytes = Data()
|
||
|
||
var index = hexData.startIndex
|
||
while index < hexData.endIndex {
|
||
let nextIndex = hexData.index(index, offsetBy: 2, limitedBy: hexData.endIndex) ?? hexData.endIndex
|
||
let byteString = String(hexData[index..<nextIndex])
|
||
|
||
if let byte = UInt8(byteString, radix: 16) {
|
||
bytes.append(byte)
|
||
}
|
||
|
||
index = nextIndex
|
||
}
|
||
|
||
return de(data: bytes)
|
||
}
|
||
|
||
// 解密数据
|
||
static func de(data: Data) -> Data {
|
||
guard !data.isEmpty else {
|
||
return data
|
||
}
|
||
|
||
let saltLen = Int(data[data.startIndex])
|
||
guard data.count >= 1 + saltLen else {
|
||
return data
|
||
}
|
||
|
||
let salt = data.subdata(in: 1..<1+saltLen)
|
||
let encryptedData = data.subdata(in: 1+saltLen..<data.count)
|
||
|
||
return deWithSalt(data: encryptedData, salt: salt)
|
||
}
|
||
|
||
// 使用盐值解密数据
|
||
static func deWithSalt(data: Data, salt: Data) -> Data {
|
||
let decryptedData = cxEd(data: data)
|
||
return removeSalt(data: decryptedData, salt: salt)
|
||
}
|
||
|
||
// 加密/解密数据(按位取反)
|
||
static func cxEd(data: Data) -> Data {
|
||
return Data(data.map { $0 ^ 0xFF })
|
||
}
|
||
|
||
// 从数据中移除盐值
|
||
static func removeSalt(data: Data, salt: Data) -> Data {
|
||
guard !salt.isEmpty else {
|
||
return data
|
||
}
|
||
|
||
var result = Data()
|
||
let saltBytes = [UInt8](salt)
|
||
let saltCount = saltBytes.count
|
||
|
||
for (index, byte) in data.enumerated() {
|
||
let saltByte = saltBytes[index % saltCount]
|
||
let decryptedByte = calRemoveSalt(v: byte, s: saltByte)
|
||
result.append(decryptedByte)
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// 计算移除盐值后的字节
|
||
static func calRemoveSalt(v: UInt8, s: UInt8) -> UInt8 {
|
||
if v >= s {
|
||
return v - s
|
||
} else {
|
||
return UInt8(0xFF) - (s - v) + 1
|
||
}
|
||
}
|
||
}
|