2

以前我做了三重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。那么,如何使用数据密钥进行 AES 256 加密?

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

4

2 回答 2

0

阅读文件:

NSData* myData = [NSData dataWithContentsOfFile:myFileWithPath];

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

Mac 和 iPhone 上的 Base64 编码选项

进行 Base64 转换。

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

于 2012-05-30T14:48:33.130 回答
0

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

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

请参阅KennyTM 的回答

更新 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 的回答

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

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

用于编码 base64

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

希望对你有帮助!

于 2012-05-28T18:11:29.217 回答