objective-c - 将 Objective-C 代码转换为 Swift

标签 objective-c swift encryption commoncrypto cryptoswift

我真的需要一些帮助来使用 CryptoSwift 将 Objective-C 代码转换为 swift。我不确定如何在 Swift 中使用以下函数:bzerogetCStringmalloc

+(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;
}

有人知道如何满足需要指针的参数吗? 我正在尝试使用 UnsafeMutablePointers 并且我也尝试了下面的代码,但我知道这是完全错误的:

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)

最佳答案

swift 2.0

没有必要使用 bzero、getCString、malloc,下面是一个不需要使用的示例:

将Security.framework添加到项目中
将 #import 添加到桥接 header 。

// 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;
}

使用示例:

let keyData     = "12345678901234567890123456789012".dataUsingEncoding(NSUTF8StringEncoding)
let messageData = "Don´t try to read this text. Top Secret Stuff".dataUsingEncoding(NSUTF8StringEncoding)
let encrypted = testCrypt(data:messageData!, keyData:keyData!, operation:kCCEncrypt)

这是 UInt8 的 Swift Arrays 版本,没有 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;
}

使用示例:

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)

关于objective-c - 将 Objective-C 代码转换为 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32696551/

相关文章:

ios - 将所有捆绑资源复制到 Documents 目录内的单独文件夹中

objective-c - 对刚刚移植到 Swift 的类的引用显示为前向类对象

c# - 使用 .NET 类的 OpenSSL 加密

android - 如何在 flutter 中存储 key 对?

java - Java 中的简单 AES 加密器

objective-c - 如何在 Revenuecat 上使用 1 个以上的产品?

ios - Xcode 没有在断点处停止

ios - 添加 WatchKit 目标后,它的文件变为红色

ios - 在不改变大小的情况下改变 skspritenode 的纹理

ios - UIView 上的 CollectionView 单元实例(委托(delegate)之外)无法快速运行 5