在obj-c中加密NSData到NSString?

时间:2009-09-13 14:38:54

标签: iphone objective-c encryption nsstring nsdata

我有一个iPhone应用程序,它使用CCCrypt(AES256)和明文密钥加密输入的NSString。字符串和密钥被赋予加密方法,该方法返回NSData对象。

请求[数据描述]其中'数据'是加密的字符串数据给出如下的NSString:“< 0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a>”但是当我尝试将其转换为NSString时,我得到“(null)”。

我需要向用户返回一个NSString,它可以用于使用相同的明文密钥解密回原始字符串。如果NSData对象的'description'属性可以返回一个字符串,有没有办法从NSData对象生成一个NSString而不能得到“(null)”?

更新:感谢Quinn,他建议使用Base64编码来生成混乱的字符串。据我所知,Base64编码不只是交换字符,但字符交换取决于位置,所以没关系。

我唯一担心的是我希望能够使用'密码短语'加密邮件,并且当需要解码混乱的字符串时需要输入相同的密码短语 - 任何人都可以建议实现此方法吗?

2 个答案:

答案 0 :(得分:33)

首先,不要使用-[NSData description]为此目的创建NSString。 (最好将-description视为调试输出。如果my previous answer误导您,我只是打印描述以证明NSData可以加密和解密,我很抱歉。)而是使用NSString的{{1在NSData和NSString之间转换的方法和-dataUsingEncoding:方法。即使有这些,请注意AES加密的数据可能不会很好地转换为字符串 - 某些字节序列不能很好地播放,因此在创建字符串之前对数据进行编码是个好主意。

我建议您尝试Base64 encoding NSData,因为Base64数据总是可以表示为ASCII字符串。 (当然,当你这样做时,你必须在解密之前从Base64解码。)

以下是一些有用的资源......


编辑:我假设您将此与我对your previous question对NSString对象的AES加密的回答结合起来。将数据编码为Base64不会对数据本身施加任何限制 - 它当然可以是AES加密的数据本身。如果您只想要字符串输入和输出,这是该怎么做:

  • 加密
    • 提供要加密的NSString,以及用于加密的密码。
    • 将字符串转换为NSData并对其执行AES加密(请参阅上一个问题)。
    • 对NSData进行Base64编码,然后创建并返回编码输出的NSString。
  • 解密
    • 提供加密和编码的字符串以及用于解密的密码。
    • 从第一个字符串创建NSData,然后对数据进行Base64解码。
    • 对数据执行AES解密,然后创建并返回NSString。

这只是将两个部分链接在一起并在出路时反向执行的问题。根据我之前的回答,您可以修改-initWithData:encoding:以执行最后一步并返回一个字符串,并将encryptString:withKey:更改为decryptData:withKey:并接受两个字符串。这很简单。

答案 1 :(得分:2)

我为NSData和NSString整理了一组完整的类别,为字符串提供AES256加密。

有关详细信息,请参阅“原始”问题的my answer