将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
}
}