【问题标题】:Objective C: AES 256 Encryption with NSData Key目标 C:使用 NSData 密钥的 AES 256 加密
【发布时间】:2012-05-28 14:29:19
【问题描述】:

之前我做了三重DES加密,通过定义一个方法使用字符串密钥文件加密一些数据

+ (NSData *)tripleDESEncryptWithKey:(NSString *)key dataToEncrypt:(NSData*)convertedData   {}. 

现在,我同样在进行 AES 256 加密。但这一次,我不能使用字符串作为键。我需要使用

从资源文件中获取 NSData
NSData *keyData = [NSData dataWithContentsOfFile:keyPath];

由于我需要将此键作为参数传递,因此我尝试使用

将其转换为字符串
NSString *key = [[NSString alloc] initWithData:keyData encoding:NSUTF8StringEncoding];

但它返回 NULL。那么,如何使用 Data 密钥进行 AES 256 加密?

编辑:我知道我不应该使用 UTF8 编码,因为数据文件是由字符串的 Base64 编码制成的。所以现在的问题是,如何从 keyData 使用 Base64 获取字符串键?

【问题讨论】:

  • 您是否已经使用断点工具来确保keyData 变量不是NULL?检查你的keyPath
  • Keypath 没问题。密钥数据也存在:。我用断点检查了很久。

标签: objective-c ios xcode


【解决方案1】:

如果key 变量返回NULL。尝试这样使用。

NSString* key = [NSString stringWithUTF8String:[keyData bytes]];

参考KennyTM's Answer

更新 1:您也可以直接从文件中读取字符串,而无需在 NSData 中进行转换

通过 NSFileHandle:

NSString * path = @"your key file path";
NSFileHandle * fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
NSData * buffer = nil;
while ((buffer = [fileHandle readDataOfLength:1024])) {
    //do something with buffer
}

或使用 NSString

NSString * key = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

参考Dave DeLong's Answer

注意:确保你的keyPath变量,是完整路径还是相对路径格式正确?

更新 2:您还可以使用 Matt Gallagher NSData+Base64 Class&Header 处理 Base64 编码(另请参阅他的博客 there

用于编码base64

NSString * key = [[path dataUsingEncoding:NSUTF8StringEncoding] base64EncodedString];

希望对你有帮助!

【讨论】:

  • 试过了。仍然是空的!
  • 实际上,你需要从资源asset中的文件中读取密钥字符串,对吧?直接从你的文件中读取字符串。查看我的更新答案
  • 编辑:我知道我不应该使用 UTF8 编码,因为数据文件是由字符串的 Base64 编码制成的。那么现在的问题是,如何从 keyData 中使用 Base64 获取字符串键?
  • 我想,我可以使用你的答案这一行: NSString * key = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; ,但我只需要使用Base64而不是NSUTF8StringEncoding。怎么样?
【解决方案2】:

读取文件:

NSData* myData = [NSData dataWithContentsOfFile:myFileWithPath];

然后使用本文中的实现之一:

Base64 encoding options on the Mac and iPhone

进行 Base64 转换。

注意:简单地将解密密钥粘贴到文件中是个坏主意。最理想的情况是,通过用户自己的密钥对密钥进行加密,从而安全地存储密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2017-06-07
    • 2017-04-26
    • 1970-01-01
    • 2022-07-08
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多