我正在开发一个加密应用程序,该应用程序目前可以加密纯文本文件。我需要一些关于连接和如何进行实际加密的帮助。我收到了这段加密文件的代码,但我有点困惑。我需要做的是有一个按钮(加密)来获取这个文本文件并加密它。我应该先提取文件的内容,然后加密它吗?为什么呢程序必须知道选择了什么文件,这样它才能对其进行加密,而我现在是个十足的傻瓜,我需要一些帮助。
将非常感谢循序渐进的指导。
这是代码:
- (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];
}
}
}
这是代码:
- (NSData*) encryptString:(NSString*)plaintext withKey:(NSString*)key { return [[plaintext dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key]; }
首先,查看AES256EncryptWithKey:
消息的接收方。这是另一条嵌套消息:
[plaintext dataUsingEncoding:NSUTF8StringEncoding]
什么是plaintext
?它在您的encryptString:withKey:
方法中声明:它是一个变量,包含指向NSString的指针。
因此,您正在向NSString实例发送dataUsingEncoding:
消息。
如果您打算加密一些纯文本用户输入,这是很好的,但对于加密文件来说就不那么好了。NSString只代表人类字符;用户可能想要加密非纯文本的文件,例如图像和视频文件。
我知道你说过你的应用程序"目前只加密文本文件",但当你放弃这个限制时,解决方案实际上更简单
因此,您需要加密任何数据,而不仅仅是字符串。删除您的encryptString:withKey:
方法--它是无用的。
从该后期方法的实现中,我们知道您将AES256EncryptWithKey:
发送到通过将dataUsingEncoding:
发送到NSString实例而获得的对象。
如果您查看NSString的文档,您可以看到dataUsingEncoding:
返回了什么。扰流板:它返回一个NSData对象。
从那里,只需一个指向NSData文档的超链接,您就可以在其中找到两件事:
- 它没有选择器
AES256EncryptWithKey:
的方法 - 它确实有从文件内容创建数据对象的方法。(我会让你找到它们。)
我假设您知道#1,并从某处下载了一个类别实现。我还假设,事实上,这个类别是NSData上的;类别的@interface
在其标题中会告诉您。
在Objective-C中,您不应该使用索引循环来遍历数组,除非您确实需要某些东西的索引,而您通常不需要,特别是不需要。相反,使用快速枚举:
for (NSString *path in [openPanel filenames]) {
}
您可以再次看到这是如何使解决方案更简单的。它也更快。
在该循环中,将该路径传递给NSData类方法,该方法根据文件的内容创建NSData对象。然后,向该数据对象发送AES256EncryptWithKey:
消息以获得密文,您可能应该将其写入一个单独的文件。我将向您介绍计算输出文件路径所需的路径操作方法的NSString文档,以及将密文数据写入输出文件所需的方法的NSData文档。