1

我在 iOS 应用程序中实现 AES128 位加密/解密,用于从 .net 服务器发送/接收数据,我几乎完成了,但是在单元测试期间,我在加密字符串中遇到了一些问题,一些加密字符串与 .net 服务器上的不相似,可以说 98% 的字符串在双方都是正确的,但问题出现在 2% 的字符串中,当我匹配双方加密的字符串时,然后在 iOS 端发现生成的字符串有点短,.net 端它是长字符串。我发现 iOS 字符串的另一件事是 .net 字符串的子字符串。当我尝试解密 iOS 生成的加密字符串时,它没有被解密显示为空,但是当我尝试解密 .net 服务器生成的加密字符串(它比 iOS 大)时,我能够看到解密的字符串。

使用相同的 KEY(服务器端和 iOS 端长 16 个字符)。

您能否提出解决方案或我错在哪里。

非常感谢大家。

原始字符串:"custId=10&mode=1" KEY= "PasswordPassword"

在 iOS 加密字符串:r51TbJpBLYDkcPC+Ei6Rmg==

在 .net 加密字符串:r51TbJpBLYDkcPC+Ei6RmtY2fuzv3RsHzsXt/RpFxAs=

加密填充 = kCCOptionPKCS7Padding;

我按照本教程进行操作。 http://automagical.rationalmind.net/2009/02/12/aes-interoperability-between-net-and-iphone/

4

2 回答 2

1

如您所见,这两个密文可能不同的原因有很多。您可以尝试一件事:将密文从一个交给另一个,并要求他们解密;如果可以的话,你可以很确定双方都在做基本相同的事情。

于 2015-02-19T10:09:38.240 回答
1

在 CryptoSE 上发现了一个类似的问题

我的版本 TL;DR

本质上 .net 和 iOS 都有不同的实现,并且由于您遵循的指南是 2009 年的,我预计它现在已经过时了,因为从那时起每个平台都至少有 1 次重大修订。

原始答案给出以下答案:

我马上能想到四个原因:

  1. 他们都没有使用AES256。我在 Obj-C 文档中看到他们正在使用 AES256 的直接声明(除非您故意更改它),我在 Visual Basic 文档中没有看到任何声明他们正在使用什么密钥大小(除非那是他们“块位”的意思)。

  2. 不同的键。AES256 采用 256 位的密钥;没有标准方法可以将五个字符串转换为 256 位值。现在,有很多可能的方法;没有特别保证他们都使用同一个。

  3. 不同的操作模式。AES 分组密码采用 128 位值,并将其转换为 128 位值。但是,并非我们所有的消息都可以放入 128 位,此外,有时除了消息加密之外,我们还想做其他事情。操作模式是一种采用分组密码的方法,并将其用作执行一些更普遍有用的功能(例如加密更长的消息)的工具。有许多标准的操作模式,Obj-C 文档说明它使用的是 CBC 模式;Visual Basic 文档有听起来很吓人的单词,这可能是对 CBC 模式的乱码解释。

  4. 四。某些操作模式(例如 CBC 模式)让加密器随机选择一个“初始化向量”;可以与加密消息一起翻译(因为解密器需要该值)。如果您第二次加密消息,则此初始化向量所做的其中一件事是,第二个密文将与第一个密文完全不同;这样,听的人将无法推断出您只是重复了一条消息。Obj-C 文档明确表示它将选择一个随机 IV(除非告诉自己给它一个)。

  5. 如您所见,这两个密文可能不同的原因有很多。您可以尝试一件事:将密文从一个交给另一个,并要求他们解密;如果可以的话,你可以很确定双方都在做基本相同的事情。

于 2013-03-20T09:41:00.833 回答