asp.net - AES128 位加密字符串与 .net 上的不相似

标签 asp.net ios xcode ipad aes

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

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

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

非常感谢大家。

原始字符串:“custId=10&mode=1” KEY="密码密码"

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

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

用于加密的填充 = kCCOptionPKCS7Padding;

我遵循了本教程。 http://automagical.rationalmind.net/2009/02/12/aes-interoperability-between-net-and-iphone/

最佳答案

A similar question found on CryptoSE

我的版本 TL;DR

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

原始答案给出以下答案:

我可以立即想到四个原因:

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

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

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

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

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

关于asp.net - AES128 位加密字符串与 .net 上的不相似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15517496/

相关文章:

asp.net - ASP.NET 的最佳部署策略是什么

ios - 如何使 Swift 中的 UILabel 成为一个圆圈

ios - 自动布局、UIDynamics 和动画

ios - Xcode 在点击时禁用 UIButton 标题淡入淡出

iphone - 如何为 iOS 4 编译和使用 CommonCrypto?

c# - 如何在 asp.net 中删除或更新部分查询字符串

asp.net - 将 MVC-3 升级到 MVC-4

ios - ios 8从后台进入前台时如何播放MPMoviePlayerController?

Xcode 运行缓慢并占用 CPU

c# - WCF Restful返回HttpResponseMessage想在设置内容时进行协商