gpt4 book ai didi

objective-c - 将 objective-c 代码转换为 swift

转载 作者:可可西里 更新时间:2023-11-01 01:04:34 25 4
gpt4 key购买 nike

我真的需要一些帮助来使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com