【问题标题】:Cocoa encryption plain text?可可加密纯文本?
【发布时间】:2012-08-23 00:58:45
【问题描述】:

我正在开发一个加密应用程序,该应用程序现在对纯文本文件进行加密。我需要一些连接方面的帮助以及如何进行实际加密。我收到了这个sn-p的代码来加密一个文件,但我有点困惑。我需要做的是有一个按钮(加密)来获取这个文本文件并对其进行加密。我应该先提取文件的内容,然后加密吗?怎么会这样?该程序必须知道选择了哪个文件以便对其进行加密,而我现在是一个完全的菜鸟,我需要一些帮助。

分步说明将不胜感激。

这是代码:

- (NSData*) encryptString:(NSString*)plaintext withKey:(NSString*)key {
    return [[plaintext dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key];
}

我已经使用以下 sn-p 实现了一个文件选择器:

- (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];

        }

    }
}

【问题讨论】:

  • 你在正确的轨道上。你有你的文件。现在你需要做的是提取文本,这样你就可以将它传递给你的 encryptString 方法(看看 NSString,我相信它是 stringWithContentsOfFile)。加密字符串后,您将拥有一个 NSData 实例。您需要做的就是用该数据编写一个新文件(查看 NSData,writeToFile)。希望有人能够为您留下更详细的答案,但这应该会让您继续前进。
  • 非常感谢。我想知道,我应该如何将这个 NSString 方法连接到一个按钮,但是如果我只是想在它上面包裹一个 IBAction,它就不起作用,再次请忽略我的无知。谢谢!
  • 您应该在您的类中为一个控制器对象实现 action 方法,该对象要么加载包含窗口(和按钮)的 nib,要么位于同一个 nib 中。在非基于文档的应用程序中,此对象要么是应用程序的委托,要么由作为应用程序委托的对象创建。我走后一条路线,因为它使我的代码更有条理。

标签: cocoa file encryption aes


【解决方案1】:

这是代码:

- (NSData*) encryptString:(NSString*)plaintext withKey:(NSString*)key {
    return [[plaintext dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key];
}

首先,查看AES256EncryptWithKey: 消息的接收者。这是另一个嵌套消息:

[plaintext dataUsingEncoding:NSUTF8StringEncoding]

plaintext 是什么?它在您的 encryptString:withKey: 方法中声明:它是一个变量,包含一个指向 NSString 的指针。

因此,您将 dataUsingEncoding: 消息发送到 NSString 实例。

如果您打算加密一些纯文本用户输入,这很好,但它对加密文件不太好。 NSStrings 仅用于人类角色;用户可能希望加密非纯文本文件,例如图像和视频文件。

我知道你说过你的应用程序“现在只加密纯文本文件”,但是当你放弃这个限制时,解决方案实际上更简单。

因此,您需要加密任何数据,而不仅仅是字符串。删除你的encryptString:withKey: 方法——没用。

从该后期方法的实现中,我们知道您将AES256EncryptWithKey: 发送到通过将dataUsingEncoding: 发送到NSString 实例获得的对象。

如果你查看the documentation for NSString,你可以看到what dataUsingEncoding: returns。剧透:它返回一个 NSData 对象。

从那里,它是一个超链接到the NSData documentation,在那里你会发现两件事:

  1. 选择器AES256EncryptWithKey:没有方法。
  2. 它确实具有从文件内容创建数据对象的方法。 (我会让你找到它们。)

我假设您知道 #1,并从某个地方下载了一个类别实现。我还假设,事实上,这个类别在 NSData 上;该类别的 @interface 在其标题中会告诉您。

在 Objective-C 中,您不应该使用索引循环来遍历数组,除非您确实需要某些东西的索引,而您通常不需要,特别是您也不需要。相反,请使用fast enumeration:

for (NSString *path in [openPanel filenames]) {
}

您可以再次看到这如何使解决方案更简单。它也更快。

在该循环中,将该路径传递给 NSData 类方法,该方法从文件内容创建 NSData 对象。然后,向该数据对象发送AES256EncryptWithKey: 消息以获取密文,您可能应该将其写入单独的文件。我将向您推荐 NSString 文档,了解您需要计算输出文件路径的路径操作方法,以及 NSData 文档,了解您需要将密文数据写入输出文件的方法。

【讨论】:

  • 非常感谢您的帮助。但是假设我只想加密纯文本文件。所以上面的 sn-p 就是这样做的,对吧?如果我要使用该 sn-p,我将如何将其连接到一个按钮,该按钮提取用户通过该文件选择器选择的文件内容以进行加密?再次感谢
  • @Husayn:文本文件是所有文件的子集,我提供的解决方案适用于所有文件。要将自己限制在文本文件中,请告诉打开的面板只应启用文本文件。您要限制的类型是 public.plain-text (来自 developer.apple.com/mac/library/documentation/Miscellaneous/… )。有关更多详细信息,请参阅 NSOpenPanel 及其超类的文档。
  • 好的,知道了。如您所知,在可可开发方面,我是初学者。那么如何将此加密连接到用户通过选择器选择的文件?
  • @Husayn:“选择器”在这里有别的意思,在 Objective-C 语言文档中有解释。打开的面板为您提供了一系列文件名(或 URL——您的选择),如您问题中的代码所示。我的回答解释了如何处理这些文件名(或 URL)。
  • 哦,我现在明白了,非常感谢您的帮助。如果我遇到困难,我希望你不介意我再问你一些问题。
猜你喜欢
  • 1970-01-01
  • 2016-10-21
  • 2016-07-30
  • 1970-01-01
  • 2023-03-03
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
相关资源
最近更新 更多