我有一个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编码不只是交换字符,但字符交换取决于位置,所以没关系。
我唯一担心的是我希望能够使用'密码短语'加密邮件,并且当需要解码混乱的字符串时需要输入相同的密码短语 - 任何人都可以建议实现此方法吗?
答案 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加密的数据本身。如果您只想要字符串输入和输出,这是该怎么做:
这只是将两个部分链接在一起并在出路时反向执行的问题。根据我之前的回答,您可以修改-initWithData:encoding:
以执行最后一步并返回一个字符串,并将encryptString:withKey:
更改为decryptData:withKey:
并接受两个字符串。这很简单。
答案 1 :(得分:2)
我为NSData和NSString整理了一组完整的类别,为字符串提供AES256加密。
有关详细信息,请参阅“原始”问题的my answer。