我有一个 iPhone 应用程序,它使用 CCCrypt (AES256) 和明文 key 对输入的 NSString 进行加密。字符串和 key 被提供给返回 NSData 对象的加密方法。
请求 [data description],其中 'data' 是加密的字符串数据,给出一个 NSString,如:“<0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a>” 但是当我尝试将其转换为 NSString 时,我得到“(null )".
我需要返回一个 NSString 给用户,它可以用来使用相同的明文 key 解密回原始字符串。如果 NSData 对象的“描述”属性可以返回一个字符串,有什么方法可以从 NSData 对象生成 NSString 而无需获取“(null)”?
更新:感谢 Quinn,他建议使用 Base64 编码来生成困惑的字符串。据我了解,Base64编码并不是简单地交换字符,而是字符交换取决于位置,这样就可以了。
我唯一担心的是,我希望能够使用“密码”加密消息,并要求在需要解码困惑的字符串时输入相同的密码 - 有人可以建议实现方法吗?
最佳答案
首先,不要使用-[NSData description]
为此目的创建一个NSString。 (最好将 -description
视为调试输出。如果 my previous answer 误导了您,我深表歉意,我只是打印描述来证明 NSData 可以加密和解密。)相反,使用 NSString 的 -dataUsingEncoding:
和 -initWithData:encoding:
方法在 NSData 和 NSString 之间进行转换。即使有了这些,请注意,AES 加密数据可能无法按原样很好地转换为字符串 — 一些字节序列不会很好地播放,因此最好在创建字符串之前对数据进行编码。
我建议你试试 Base64 encoding NSData,因为 Base64 数据总是可以表示为 ASCII 字符串。 (当然,当你这样做时,你必须在解密之前从 Base64 解码。)
这里有一些有用的资源...
- Colloquy有一些代码对 NSData(header 和 implementation)进行编码/解码
- Google Toolbox for Mac具有相似的功能(header 和 implementation)
- A Cocoa With Love blog post关于这个话题。
- A CocoaDev.com wiki page关于这个话题。
编辑: 我假设您会将此与我对 your previous question 的回答结合起来关于 NSString 对象的 AES 加密。将数据编码为 Base64 不会对数据本身施加任何限制——它当然可以是 AES 加密数据本身。如果您只想输入和输出字符串,请执行以下操作:
- 加密
- 提供要加密的 NSString 和用于加密的密码。
- 将字符串转换为 NSData 并对其执行 AES 加密(参见上一个问题)。
- 对 NSData 进行 Base64 编码,然后创建并返回编码输出的 NSString。
- 解密
- 提供加密和编码的字符串,以及用于解密的密码。
- 从第一个字符串创建一个 NSData,然后对数据进行 Base64 解码。
- 对数据执行 AES 解密,然后创建并返回一个 NSString。
这实际上只是将两个部分链接在一起并在输出时反向执行它们的问题。根据我之前的回答,你可以修改 encryptString:withKey:
执行最后一步并返回一个字符串,并将 decryptData:withKey:
更改为 decryptString:withKey :
并接受两个字符串。这非常简单。
关于iphone - 在 obj-c 中将 NSData 加密为 NSString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1417893/