0

我正在构建一个简单的 iphone (SDK6.1) 应用程序,它加密一些用户的笔记,将其存储到数据库中,当用户输入密码(不需要加密)时,它将解密他的笔记并将它们显示给他。

对于我使用核心数据(.xcdatamodel)的数据库。此时的加密文本在数据模型和 Notes.h 文件中被声明为 String,e 它被声明为 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?

4

2 回答 2

2

您不能NSString像这样将任意字节序列转换回来。例如,如果data包含单个字节128(十六进制0x80),则

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

创建一个带有一个 Unicode 字符 U+0080 的字符串。当您将其转换回NSDatawith

NSData *d1 = [string dataUsingEncoding:NSUTF8StringEncoding];

然后d1将包含字节0xC2 0x80(这是 U+0080 的 UTF-8)。但

NSData *d2 = [string dataUsingEncoding:NSASCIIStringEncoding];

也不起作用 ( d2 = nil),因为字符串无法转换为 7 位 ASCII。

所以你应该要么

  • 将加密数据作为“二进制数据”存储在 Core Data 中,或者
  • 将加密数据存储为字符串,但选择不同的转换策略,例如 Base64。
于 2013-04-10T21:56:18.450 回答
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];
于 2013-04-11T10:49:19.147 回答