在obj-c中加密NSData到NSString?

Boz*_*Boz 15 iphone encryption objective-c 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编码不只是交换字符,但字符交换取决于位置,所以没关系.

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

Qui*_*lor 33

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

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

这是一些有用的资源......


编辑:我假设你将这与我之前关于NSString对象的AES加密的问题的答案结合起来.将数据编码为Base64不会对数据本身施加任何限制 - 它当然可以是AES加密的数据本身.如果你只想要字符串输入和输出,这是怎么做的:

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

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

  • +1并感谢NSDataAdditions的链接,非常有用! (3认同)