Problème à l'aide de CCCrypt (CommonCrypt) dans Swift

Je suis portage d'un travail Objectif-de la Catégorie C (NSData+AESCrypt.m) pour Swift, et j'ai trouvé un problème à travailler avec les pointeurs. Le code pour le chiffrement de la partie en Swift compile correctement, mais génère un runtime EXEC_BAD_ACCES erreur.

Le code que j'ai jusqu'ici (j'ai essayé de décortiquer le code autant que possible) :

let key = "123456789012345678901234567890120"
let keyLength = UInt(kCCKeySizeAES256 + 1)
let keyPointer = strdup(key)    //Convert key to <UnsafeMutablePointer<Int8>
let message = "Don´t try to read this text. Top Secret Stuff"
let data = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding)
let dataBytes = data?.bytes
let length = data?.length
let dataLength = UInt(length!)
let dataPointer = UnsafePointer<UInt8>(dataBytes!)
let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
let cryptBufferSize = UInt(dataLength + kCCBlockSizeAES128)
var cryptBuffer = [UInt8](count: Int(cryptBufferSize), repeatedValue: 0)
var cryptBufferPointer = UnsafeMutablePointer<UInt8>(cryptBuffer)
var numBytesEncrypted = UnsafeMutablePointer<UInt>()
var cryptStatus = CCCrypt(operation, algoritm, options, keyPointer, keyLength, nil, dataPointer, dataLength, cryptBufferPointer, cryptBufferSize, numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
let size = NSInteger(cryptBufferSize)
let encryptedData = NSData(bytes: cryptBufferPointer, length: size)
let encryptedString = NSString(data: encryptedData, encoding: NSUTF8StringEncoding)
println("Encrypted String = \(encryptedString)") //EXEC_BAD_ACCESS error
} else {
println("Error: \(cryptStatus)")
}

La encryptedData objet affiche les informations suivantes:

<279c2d0f d3ce2200 0dc10cc1 9df46e76 cb26f423 7c9bde76 f9d8d0e2 632acef9 74fb0614 4717422b 684d1889 e3ce882c 00000000 00000000 00000000 0000>

Mais la encryptedString montre 0x0000000000 dans le débogueur, et en essayant de println() il génère le EXEC_BAD_ACCESS erreur

Une idée de ce qui est absent?

Rgds....

Il y a quelques problèmes ici. 1. La longueur de la clé est incorrecte. 2. La sortie n'est pas redimensionnée à numBytesEncrypted. 3. Une Chaîne UTF-8 ne peut pas être créé fom de données arbitraires, ce n'est pas toutes les données peuvent former une chaîne UTF-8.
À partir d'un point de vue sécurité t, et l'hypothèse de la sécurité est le résultat souhaité, à l'aide d'un String comme une clé est également une mauvaise idée, si une Chaîne de caractères est utilisée, elle doit être utilisée pour dériver une clé avec PBKFD2. Enfin: Ne pas utiliser le mode ECB, c'est l'insécurité, voir BCE mode, faites défiler vers le bas pour le Pingouin. Au lieu d'utiliser le mode CBC avec un hasard IV, juste préfixe les données cryptées avec le IV pour une utilisation dans le déchiffrement, il n'a pas besoin de ne pas secret.

OriginalL'auteur eharo2 | 2014-09-09