将objective-c代码转换为swift

将objective-c代码转换为swift,objective-c,swift,encryption,commoncrypto,cryptoswift,Objective C,Swift,Encryption,Commoncrypto,Cryptoswift,我确实需要一些帮助来使用CryptoSwift将objective-c代码转换为swift。我不知道如何在Swift中使用诸如:bzero,getCString,malloc之类的函数 +(NSData*)encryptData:(NSData*)data { static NSString *key = @"BitCave012345678"; char keyPtr[kCCKeySizeAES128+1]; bzero(keyPtr, sizeof(keyPtr));

我确实需要一些帮助来使用
CryptoSwift
将objective-c代码转换为swift。我不知道如何在Swift中使用诸如:
bzero
getCString
malloc
之类的函数

+(NSData*)encryptData:(NSData*)data
{
    static NSString *key = @"BitCave012345678";
    char keyPtr[kCCKeySizeAES128+1];
    bzero(keyPtr, sizeof(keyPtr));

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode,
                                          keyPtr,kCCKeySizeAES128,NULL,[data bytes],dataLength,
                                          buffer, bufferSize, &numBytesEncrypted);

    if(cryptStatus == kCCSuccess)
    {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer);

    return nil;
}
有人知道如何满足需要指针的参数吗? 我尝试使用
不可女性化的指针
,我也尝试了下面的代码,但我知道这是完全错误的:

var key: NSString = "BitCave012345678"
        var keyPtr: Array<Character> = Array<Character>(count: 17, repeatedValue: "0")
        bzero(&keyPtr, 17*sizeof(Character))
        key.getCString(&keyPtr, maxLength: 17*sizeof(Character), encoding: NSUTF8StringEncoding)
变量键:NSString=“BitCave012345678” var keyPtr:Array=Array(计数:17,重复值:“0”) bzero(&keyPtr,17*sizeof(字符)) key.getCString(&keyPtr,maxLength:17*sizeof(字符),编码:NSUTF8StringEncoding) Swift 2.0

不必使用bzero、getCString、malloc,下面的示例没有:

将Security.framework添加到项目中
将#导入添加到桥接标头

// operation is either 'kCCEncrypt' or 'kCCDecrypt'
func testCrypt(data data:NSData, keyData:NSData, operation:Int) -> NSData? {
    let keyBytes = UnsafePointer<UInt8>(keyData.bytes)

    let dataLength = Int(data.length)
    let dataBytes  = UnsafePointer<UInt8>(data.bytes)

    let cryptData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
    let cryptPointer = UnsafeMutablePointer<UInt8>(cryptData.mutableBytes)
    let cryptLength  = size_t(cryptData.length)

    let keyLength              = size_t(kCCKeySizeAES128)
    let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
    let options:   CCOptions   = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)

    var numBytesEncrypted :size_t = 0

    let cryptStatus = CCCrypt(CCOperation(operation),
        algoritm,
        options,
        keyBytes, keyLength,
        nil,
        dataBytes, dataLength,
        cryptPointer, cryptLength,
        &numBytesEncrypted)

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        cryptData.length = Int(numBytesEncrypted)

    } else {
        print("Error: \(cryptStatus)")
    }

    return cryptData;
}
以下是UInt8的Swift
数组
中的版本,没有
NSData
对象:

func testCrypt(data data:[UInt8], keyData:[UInt8], operation:Int) -> [UInt8]? {
    let keyBytes = UnsafeMutablePointer<UInt8>(keyData)

    let dataLength = data.count
    let dataBytes  = UnsafeMutablePointer<UInt8>(data)

    var cryptData = [UInt8](count:data.count+kCCBlockSizeAES128, repeatedValue:0)
    let cryptPointer = UnsafeMutablePointer<UInt8>(cryptData)
    let cryptLength  = size_t(cryptData.count)

    let keyLength              = size_t(kCCKeySizeAES128)
    let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
    let options:   CCOptions   = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)

    var numBytesEncrypted :size_t = 0

    let cryptStatus = CCCrypt(CCOperation(operation),
        algoritm,
        options,
        keyBytes, keyLength,
        nil,
        dataBytes, dataLength,
        cryptPointer, cryptLength,
        &numBytesEncrypted)

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        cryptData.removeRange(numBytesEncrypted..<cryptData.count)

    } else {
        print("Error: \(cryptStatus)")
    }

    return cryptData;
}

我知道有更好的解决办法。但我需要传统的支持(旧数据库,已经加密),所以我将Barts Obj-C代码翻译成Swift 5代码。也许有人也需要它

extension Data {

    func aesDecrypt() -> Data? {

        let myKey:String = "BitCave012345678"

        var keyPtr = [Int8](repeating: 0, count: kCCKeySizeAES128+1)
        myKey.getCString(&keyPtr, maxLength: keyPtr.count, encoding: String.Encoding.utf8)

        var numBytesDecrypted :size_t = 0
        let dataLength:Int = self.count
        let bufferSize: size_t = dataLength + kCCBlockSizeAES128
        let bufferDecrypt = malloc(bufferSize)
        let iv = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

        let result:CCCryptorStatus = CCCrypt(CCOperation(kCCDecrypt), CCAlgorithm(kCCAlgorithmAES128), CCOptions(kCCOptionPKCS7Padding), keyPtr, kCCKeySizeAES128, iv, self.bytes, self.count, bufferDecrypt, bufferSize, &numBytesDecrypted)

        if (result == kCCSuccess) {
            return Data(bytes: bufferDecrypt!, count: numBytesDecrypted)
        }

        free(bufferDecrypt)

        return nil
    }
}

请不要将相关问题信息“外包”到链接后面的某个地方,也不要将源代码以图片的形式呈现。您有没有看过关于CCCrypt的现有Swift问答?在我看来,已经有一些例子了。@MartinR事实上我发现了这一点:但我仍然不知道如何管理。最好避免使用CryptoSwift,在许多其他方面,它比普通的基于加密的实现慢1000多倍。苹果公司的通用密码是经过FIPS认证的,因此经过了严格的审查,使用CryptoSwift在正确性和安全性上是一次冒险。
let keyData     = Array("12345678901234567890123456789012".utf8)
let messageData = Array("Don´t try to read this text. Top Secret Stuff".utf8)
let encrypted   = testCrypt(data:messageData, keyData:keyData, operation:kCCEncrypt)
extension Data {

    func aesDecrypt() -> Data? {

        let myKey:String = "BitCave012345678"

        var keyPtr = [Int8](repeating: 0, count: kCCKeySizeAES128+1)
        myKey.getCString(&keyPtr, maxLength: keyPtr.count, encoding: String.Encoding.utf8)

        var numBytesDecrypted :size_t = 0
        let dataLength:Int = self.count
        let bufferSize: size_t = dataLength + kCCBlockSizeAES128
        let bufferDecrypt = malloc(bufferSize)
        let iv = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

        let result:CCCryptorStatus = CCCrypt(CCOperation(kCCDecrypt), CCAlgorithm(kCCAlgorithmAES128), CCOptions(kCCOptionPKCS7Padding), keyPtr, kCCKeySizeAES128, iv, self.bytes, self.count, bufferDecrypt, bufferSize, &numBytesDecrypted)

        if (result == kCCSuccess) {
            return Data(bytes: bufferDecrypt!, count: numBytesDecrypted)
        }

        free(bufferDecrypt)

        return nil
    }
}