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
À 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
Vous devez vous connecter pour publier un commentaire.
Voici un exemple
Si ce n'est pas exactement ce qui est nécessaire, les méthodes devrait être un bon exemple
Remarque: la clé de la chaîne est convertie en données
Ajouter De La Sécurité.cadre du projet
Ajouter
#import <CommonCrypto/CommonCryptor.h>
à la transition de l'en-tête.De sortie:
Le iv est le préfixe pour les données chiffrées
aesCBC128Encrypt
permettra de créer un hasard IV et le préfixe pour le code crypté.aesCBC128Decrypt
utilisera le préfixe IV lors du déchiffrement.Entrées sont les données et les clés sont des objets de Données. Si une forme codée comme Base64 si nécessaire, convertir et/ou à partir de l'appel de la méthode.
La clé doit être exactement de 128 bits (16 octets), 192 bits (24 octets) ou 256 bits (32 octets) de longueur. Si une autre taille de clé est utilisé, une erreur sera levée.
Le remplissage PKCS#7 est définie par défaut.
Cet exemple requiert Commune Crypto
Il est nécessaire d'avoir une transition en-tête pour le projet:
#import <CommonCrypto/CommonCrypto.h>
Ajouter le
Security.framework
pour le projet.C'est un exemple, pas de code de production.
Exemple d'utilisation:
Exemple De Sortie:
Un problème typique avec le mode CBC exemple de code est qu'il laisse la création et le partage de l'aléatoire IV de l'utilisateur. Cet exemple inclut la génération de la IV, précédé des données chiffrées et utilise le préfixe IV lors du déchiffrement. Cela évite à l'utilisateur occasionnel de détails qui sont nécessaires pour En mode CBC.
Pour la sécurité des données chiffrées devraient aussi avoir une authentification, cet exemple de code ne prévoit pas que, pour être petit et permettent une meilleure interopérabilité pour les autres plateformes.
Aussi défaut de dérivation de clé de la clé à partir d'un mot de passe, il est suggéré que PBKDF2 être utilisée est le texte les mots de passe sont utilisés comme matériel de chiffrement.
Robuste prêt pour la production plate-forme multi-code de cryptage voir RNCryptor.
Si c'est une petite chose à demander ici, il implique de code créer une nouvelle question.
Désolé, je frappe de la touche entrée, j'ai donc dû aller à commenter le mode d'édition.... Je reviendrai sur la question dans une nouvelle question
Cela devrait vraiment être une nouvelle question. 1: AES est de bloquer, de sorte rembourrage est nécessaire à moins que les données toujours être un multiple de la taille des blocs de 16 octets pour l'AES). 2: Notez que le mode CBC est la valeur par défaut de manière à supprimer tous les modes de rembourrage et vous avez besoin de passer
kCCOptionECBMode
qui est juste chiffrement de base, si vous voulez ajouter des options qui signifierait en mode CBC et pas de rembourrage utilisation0
. 3: Un iv est utilisé pour le mode CBC, de la BCE mode ne nécessite pas un iv, mais n'est pas très sécurisé. Créer un iv de la même façonkeyData
oudata
est créé et dans leCCCrypt
appeler ivData.octets.Pour le mode CBC un iv est nécessaire, voir Cipher Block Chaining. Le CCCrypt méthode de fournir une valeur par défaut: "Si le mode CBC est sélectionné (en l'absence de tout mode de bits dans les options de drapeaux) et IV est présent, une valeur NULL (tous les zéros) IV sera utilisé." Mais pour la sécurité aléatoire iv doit être fournie, la convention habituelle est d'ajouter au début du iv, les données cryptées de sorte qu'il sera disponible pour le déchiffrement.eroes.
OriginalL'auteur zaph
Swift 2.0 de Chiffrement et de Déchiffrement. Juste mis à jour à la réponse ci-dessus à l'appui de Swift 2.0.
OriginalL'auteur karthikPrabhu Alagu