【问题标题】:decrytption in ios 7 not working using aesios 7中的解密无法使用aes
【发布时间】:2014-01-12 18:28:11
【问题描述】:

在我的应用程序中,我从 xml 中获取数据,它是加密的,我需要解密收到的 nsstring,

 UserName = @"QEjbHvzPjk+YuLDVPUJuEA==";

我需要将这个nsstring解密成常规格式,我搜索并找到aes,但它没有做任何改变,

  NSString* msg = [FBEncryptorAES decryptBase64String:UserName
                                          keyString:@"01234567890abcdefghijklmnopqrstuvwxyz"];

if (msg)
{
    UserName = msg;

    NSLog(@"decrypted: %@", msg);
} else
{
    UserName = @"(failed to decrypt)";
}

我怎样才能解密上面的nsstring,在此先感谢。

【问题讨论】:

  • 您需要知道用于加密字符串的进程。该字符串看起来像 base 64,因此您可能需要对其进行解码(结果是“@HώO=Bn”,假设为 UTF-8)。我假设你的密钥是一个占位符(因为它对于 AES 密钥来说似乎太大了)所以我无法看到它是否会解密为有意义的值

标签: objective-c encryption ios7


【解决方案1】:

字符串不仅是 AES 加密的,而且是 Base64 编码的。尾随“==”是典型的 base64 填充。 AES 加密也产生数据字节,而不是 ASCII 字符,并且输出是块大小的倍数。 Base64 对加密结果进行编码是很常见的,因此它是 ASCII 并且可以包含在 XML 中。

对于 iOS 7,NSData 有多种 Base64 API 方法。可能你想要的是:

- (id)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions)options

例子:

NSString *userName = @"QEjbHvzPjk+YuLDVPUJuEA==";
NSData *data = [[NSData alloc] initWithBase64EncodedString:userName options:0];
NSLog(@"data: %@", data);

NSLog 输出:
数据:

数据可能是 AES 加密的,它是块长度的倍数,如果是这样,您将需要密钥以及有关填充、模式和可能的 iv 的信息。

请注意FBEncryptorAES 类方法encryptedBase64String 确实接受Base64 输入,但解密密钥字符串是可疑的,并且由于方法和可能的原因,加密可能与此解密方法不匹配。所以FBEncryptorAES 类可能不是你需要的。

【讨论】:

  • 感谢您的回复,因为我尝试了您的建议,但生成的 nsdata 无法转换为原始形式,因为我尝试了“NSNonLossyASCIIStringEncoding”,它产生了相同的字符串类型的字符串“QEjbHvzPjk+YuLDVPUJuEA== ”,或者当我使用“NSUTF8StringEncoding”时,它返回(null)。如何获取服务器中的原始字符串。
  • 有两个步骤: 1-将Base64字符串解码为数据。 2-使用 AES 解密数据。第 2 步是关键,因为您需要知道密钥、填充、模式和 iv。可能没有填充(不太可能)。该模式可能是需要 iv 的 CBC 或不需要 iv 的 ECB。你需要知道的事情。只有密钥是秘密的。有些软件结合了所有这些东西,你需要阅读文档才能找到它们。某些软件(例如 php)没有正确填充,使事情变得更加困难。我建议您获取此信息并提供包含所有这些信息的示例。
  • NSString *userName = @"QEjbHvzPjk+YuLDVPUJuEA=="; NSData *data = [[NSData alloc] initWithBase64EncodedString:userName options:0]; NSLog(@"数据: %@", 数据); NSString *key = @"01234567890123456789012345678901"; NSData *plaintext = [数据 AES256DecryptWithKey:key]; NSLog(@"plaintext: %@", plaintext);
  • 我尝试了上面的编码,正如你在步骤 1 中提到的,但它仍然是空的
  • 如果您需要完成这项工作,您必须准确了解服务器如何对数据进行编码/加密。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 2021-05-16
  • 1970-01-01
相关资源
最近更新 更多