我正在开发一个加密应用程序,目前只能加密纯文本文件。我需要一些有关连接以及如何进行实际加密的帮助。我收到了这段用于加密文件的代码片段,但我有点困惑。我需要做的是有一个按钮(加密)来获取此文本文件并对其进行加密。我应该先提取文件的内容,然后加密它吗?为何如此?该程序必须知道选择了什么文件,以便对其进行加密,而我现在完全是个菜鸟,我需要一些帮助。
分步说明将不胜感激。
这是代码:
- (NSData*) encryptString:(NSString*)plaintext withKey:(NSString*)key {
return [[plaintext dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key];
}
我已经使用以下代码片段实现了一个文件选择器:
- (IBAction)fileChooser:(id)sender {
int i;
NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setCanChooseDirectories:YES];
[openDlg setPrompt:@"Select"];
if ([openDlg runModalForDirectory:nil file:nil] == NSOKButton )
{
NSArray* files = [openDlg filenames];
for( i = 0; i < [files count]; i++ )
{
[files objectAtIndex:i];
}
}
}
最佳答案
This was the code:
- (NSData*) encryptString:(NSString*)plaintext withKey:(NSString*)key { return [[plaintext dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key]; }
首先,查看AES256EncryptWithKey:
消息的接收者。这是另一条嵌套消息:
[plaintext dataUsingEncoding:NSUTF8StringEncoding]
什么是明文
?它在您的 encryptString:withKey:
方法中声明:它是一个保存指向 NSString 的指针的变量。
因此,您将 dataUsingEncoding:
消息发送到 NSString 实例。
如果您打算加密一些纯文本用户输入,这很好,但对于加密文件来说就不太好了。 NSString 只用于人类字符;用户可能想要加密非纯文本的文件,例如图像和视频文件。
我知道您说过您的应用程序“目前加密纯文本文件”,但当您放弃此限制时,解决方案实际上更简单。
因此您需要加密任何数据,而不仅仅是字符串。删除您的 encryptString:withKey:
方法 - 它没有用。
从该后期方法的实现中,我们知道您将 AES256EncryptWithKey:
发送到通过将 dataUsingEncoding:
发送到 NSString 实例而获得的对象。
如果你查看the documentation for NSString ,你可以看到what dataUsingEncoding:
returns 。剧透:它返回一个 NSData 对象。
从那里,只需一个超链接即可到达 the NSData documentation ,你会发现两件事:
- 它没有选择器
AES256EncryptWithKey:
的方法。 - 它确实具有从文件内容创建数据对象的方法。 (我会让你找到他们。)
我假设您知道#1,并从某处下载了类别实现。我还假设,事实上,这个类别位于 NSData 上;该类别的标题中的 @interface
会告诉您。
在 Objective-C 中,你不应该使用索引循环来迭代数组,除非你确实需要某些东西的索引,而你通常不需要,特别是你也不需要。相反,使用 fast enumeration :
for (NSString *path in [openPanel filenames]) {
}
您可以再次看到这如何使解决方案变得更简单。它也更快。
在该循环内,将该路径传递给 NSData 类方法,该方法根据文件内容创建 NSData 对象。然后,向该数据对象发送 AES256EncryptWithKey:
消息以获取密文,您可能应该将其写入单独的文件。我将建议您返回 NSString 文档,了解计算输出文件路径所需的路径操作方法,以及 NSData 文档,了解将密文数据写入输出文件所需的方法。
关于 cocoa 加密明文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6487710/