2013-04-10 2 views
0

Je construis une application iphone simple (SDK6.1) qui crypte des notes de certains utilisateurs, les stocke dans une base de données et quand l'utilisateur saisit un mot de passe (il n'a pas besoin d'être crypté) notes et montrez-lui.Enregistrement d'un texte chiffré uint8_t dans DataModel

Pour la base de données j'utilise Core Data (.xcdatamodel). Le texte crypté pour le moment est déclaré comme chaîne dans le modèle de données et dans le fichier Notes.h, il est déclaré NSString.

Pour le cryptage, j'utilise l'exemple de code Apple de CryptoExercise qui fonctionne parfaitement. Le problème est que lorsque j'essaie d'enregistrer le texte crypté dans la base de données et de le déchiffrer, je n'obtiens pas les résultats escomptés. En gros, je récupère une chaîne vide.

Évidemment j'utilise le code suivant pour convertir uint8_t en NSString afin que je puisse le stocker dans le modèle de données et je comprends que c'est mon problème principal.

uint8_t *cipherBuffer = NULL; 
SecKey *encrypt = [[SecKey alloc]init]; 
NSString *et = [[NSString alloc]init]; 

[encrypt generateKeyPairRSA]; 

// Encrypt the plain text 
cipherBuffer = [encrypt Encryption:plainTextField.text]; 

// Convert uint8_t to NSString 
NSMutableData *data = [[NSMutableData alloc]init]; 
[data appendBytes:cipherBuffer length:strlen((char*)cipherBuffer)+1]; 
NSString *string = [[NSString alloc]initWithData:data encoding: NSASCIIStringEncoding]; 

// Save to Data Model 
[self.currentNote setEncryptedText:string]; 
[self.delegate addNewNoteViewControllerDidSave]; 
// Retrieve encrypted text from database 
et = [self.currentNote encryptedText]; 

// Convert back to uint_8 
NSData *someData = [et dataUsingEncoding:NSUTF8StringEncoding]; 
const void *bytes = [someData bytes]; 
uint8_t *crypto_data = (uint8_t*)bytes; 

// Decrypt Data 
[encrypt Decryption:crypto_data]; 

Comme je l'ai dit avant que je comprends que la conversion uint8_t est ici et je voudrais savoir le principal problème qui est la bonne façon de le faire?

Est-il possible avec le modèle de données du tout, ou devrais-je aller à SQLite ??

Répondre

0

Donc, juste pour répondre à la question que je puisse utiliser le code et tout ..

J'ai changé le EncryptedText dans le modèle de données pour les données binaires et le code ressemblerait à ceci:

uint8_t *cipherBuffer = NULL; 
SecKey *encrypt = [[SecKey alloc]init]; 

[encrypt generateKeyPairRSA]; 

cipherBuffer = [encrypt Encryption:plainTextField.text]; 

NSMutableData *data = [[NSMutableData alloc]init]; 
[data appendBytes:cipherBuffer length:strlen((char*)cipherBuffer)+1]; 

// Save cipher into the Data Model 
[self.currentNote setEncryptedText:data]; 
[self.delegate addNewNoteViewControllerDidSave]; 

// Retrieve cipher back from Data Model 
NSData *etData = [[NSData alloc]init]; 
etData = [self.currentNote encryptedText]; 

// Convert back to uint8_t 
const void *bytes = [etData bytes]; 
uint8_t *crypto_data = (uint8_t*)bytes; 

// De cypher 
[encrypt Decryption:crypto_data]; 
2

Vous ne pouvez pas convertir des séquences d'octets arbitraires en NSString et inversement. Par exemple, si data contient l'octet unique 128 (hex 0x80), puis

NSString *string = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 

crée une chaîne avec un caractère Unicode U + 0080. Lorsque vous convertissez ce retour à NSData avec

NSData *d1 = [string dataUsingEncoding:NSUTF8StringEncoding]; 

alors d1 contiendra les octets 0xC2 0x80 (qui est l'UTF-8 pour U + 0080). Mais

NSData *d2 = [string dataUsingEncoding:NSASCIIStringEncoding]; 

ne fonctionne pas non plus (d2 = nil), parce que la chaîne ne peut pas être convertie en 7 bits ASCII.

donc vous devez soit

  • mémorisent les données cryptées comme « données binaires » dans les données de base, ou un magasin
  • les données cryptées comme chaîne, mais choisir une stratégie de conversion différente, par exemple base64.
+0

Merci beaucoup, je savais que les conversions étaient fausses mais depuis que je suis nouveau sur iphone je ne pouvais pas savoir les moyens de le réparer. J'ai résolu le problème en utilisant les deux façons, mais je suppose que le premier (stocker en tant que données binaires) est le plus approprié pour cette situation .. –

+1

@GeorgeNikolaides: Oui, stocker des données binaires est le meilleur moyen, c'est pourquoi je l'ai mis en premier sur la liste des solutions possibles. –

Questions connexes