【iOS技术】AES加密算法,与.NET Android互通

背景

继上一篇文章,也就是RSA加密之后,我又开始坑AES加密了,虽然这个比RSA稍微简单,但是难免碰到坑,最常见的就是3个平台加出来的数据不一样。
又是历时一天的坑啊。

发现问题

三种不同的代码加密的数据都不同。
经过这一天的百度,我明白了很多名字。
我先来描述一下问题,.NET是我们的服务端,我们只用的是 Rijndael C#自带的类 资料(我这里提供了一个大家可以戳过去)比较多。大家随便百度一下应该就能知道了。
Android使用的是自带的security类。资料
iOS使用的是CommonCryptor类(自带的不需要第三方类库)。这个稍后我会详解并且附上我的类的

从上面这些资料中我了解到,C#默认支持PKCS7Padding的填充算法,并且默认加密是ECB模式的,而Android只有PKCS5Padding的填充算法(不过有帖子说PKCS5和PKCS7是共同的 我没尝试),所以可以查看我Android后面跟着的连接,这样你就可以达到和C#共通的目的了。
然后到这里我都还没开始讲iOS接下来我就来说一下iOS的吧。
先上我的共享一个加密的Category大家可以点击下载过去啊。

发现问题

其实这个加密的类没有任何问题因为AES加密本身并不是什么很麻烦的加密,应该写起来会很简单但是我怎么都解不出来,然后我又是偶然的打开源代码我发现了这么一段2B69A37D-F4FC-49C8-B1A4-2000B458BD4B.png
到这里 大家应该知道什么问题了 =- = 果然坑一天最后都是一句话的问题。
AES256加密 其实是按照密钥的长度去生成加密串的 因为TA调用的还是AES128算法,所以我们密钥16位他就调用AES128 我们密钥32位就是相应的变成32位了,然后这个图片中的算法是,当我的key少于多少位的时候,给我填充起来。然后我的key就会和Android与.NET不同。

解决问题以及其他发现

解决问题的方法很简单 注释之=- =
好了 说到这里。如果你使用ECB你就可以不用往下看了 ,因为ECB模式是不支持初始化向量的(initializationVector 一下简称iv)。这里有个帖子演示ECB和CBC的区别
先不说哪个好吧,既然坑了就坑到底,把它们都弄清楚。

iv以及CBC模式的使用

我直接说把,我提供的类里面,如果你有iv这个东西,3c(cccryptor)自然会调用CBC(再你没指定kCCMode的情况下),相反的如果你没用使用iv自然就会调用ECB,如果你要强制指定Mode再哪里指定呢,你在代码中搜索PKCS7Padding=- = 然后你把它修改成PKCS7Padding|kCCModeECB或者其他的。

然后说一下Android吧,其实也是有iv这种东西的 javax.crypto.spec.IvParameterSpec
U2VWAXE$02UW`@SP9VGR35M.png自己看看就懂了。嘿嘿
PS:这是Android的AES加密哦!