2013-04-10 32 views
0

我正在構建一個簡單的iPhone(SDK6.1)應用程序,用於加密某些用戶的筆記,將其存儲到數據庫中,並且當用戶輸入密碼(不需要加密)時,它將解密他的記錄並展示給他。將uint8_t密文保存到DataModel中

對於我正在使用的數據庫Core Data(.xcdatamodel)。當前的加密文本在數據模型中聲明爲String,並在Notes.h中聲明爲NSString。

對於加密,我正在使用來自CryptoExercise的蘋果示例代碼,它完美地工作。

問題是,當我嘗試保存數據庫中的加密文本,然後解密它,我沒有得到所需的結果..基本上我得到一個空字符串回來。

顯然,我使用下面的代碼從uint8_t轉換爲NSString,所以我可以將它存儲到數據模型中,我明白這是我的主要問題。

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]; 

正如我以前說過我明白,轉換uint8_t是主要的問題就在這裏,我想知道這是做正確的方法是什麼?

它可能與數據模型的所有,或者我應該去SQLite?

回答

0

所以只是爲了回答這個問題,所以我可以使用代碼和一切..

我改變了EncryptedText在數據模型中二進制數據,然後將代碼應該是這樣的:

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

您不能將任意字節序列轉換爲NSString,並返回。例如,如果 包含data單字節128(十六進制0x80),然後

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

創建具有一個Unicode字符U + 0080的字符串。當您轉換這回NSData

NSData *d1 = [string dataUsingEncoding:NSUTF8StringEncoding]; 

然後d1將包含字節0xC2 0x80(這是U + 0080 UTF-8)。但

NSData *d2 = [string dataUsingEncoding:NSASCIIStringEncoding]; 

的確也無法正常工作(d2 = nil),因爲該字符串不能轉換爲7位ASCII 。

所以,你要麼

  • 存儲加密的數據爲「二進制數據」的核心數據,或
  • 存儲加密數據作爲字符串,但選擇不同的轉換策略, 例如Base64編碼。
+0

非常感謝,我知道轉換是錯誤的,但由於我是iphone新手,我不知道修復它的方法。我用兩種方法解決了這個問題,但我想第一個(存儲爲二進制數據)是最適合這種情況的.. – 2013-04-11 10:43:36

+1

@GeorgeNikolaides:是的,存儲爲二進制數據是更好的方式,這就是爲什麼我先將它放在可能的解決方案列表中。 – 2013-04-11 11:09:16