将AES加密从Java移植到Objective-C

将AES加密从Java移植到Objective-C,java,objective-c,encryption,aes,Java,Objective C,Encryption,Aes,我的任务是将AES加密从Java移植到Objective-C。我无法访问进行解密的服务器代码。使用,我成功地在Objective-C中对字符串进行了简单的AES加密,并在Java中对其进行了解密,反之亦然 然而,当我试图将Objective-C中的加密数据发送到服务器(我同样无法访问该服务器)时,服务器向我发送了一个“DER input not A octet string”错误。我认为这段代码是用Java编写的,我无法在Objective-C中复制它,因为Objective-C是我成功完成任务

我的任务是将AES加密从Java移植到Objective-C。我无法访问进行解密的服务器代码。使用,我成功地在Objective-C中对字符串进行了简单的AES加密,并在Java中对其进行了解密,反之亦然

然而,当我试图将Objective-C中的加密数据发送到服务器(我同样无法访问该服务器)时,服务器向我发送了一个“DER input not A octet string”错误。我认为这段代码是用Java编写的,我无法在Objective-C中复制它,因为Objective-C是我成功完成任务的必经之路

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, sKey);
String ivBase64 = Base64.encodeBytes(cipher.getParameters().getEncoded());
ivBase64
与加密字符串一起发送到服务器

非常感谢您对如何将这一小部分
cipher.getParameters().getEncoded()
移植到Objective-C的任何帮助


谢谢。

现在发生的是
cipher.getParameters()
调用返回
算法参数的实例。此实例具有一个具有以下描述的方法:

以参数的主编码格式返回参数。如果存在此类参数的ASN.1规范,则参数的主要编码格式为ASN.1

现在,据我所知,IV没有默认的ASN.1 DER编码,但由于IV基本上是一个字节数组,最符合逻辑的ASN.1编码是八位字节字符串。DER编码时,此ASN.1类型有一个标签,标签的值为
04h
,然后是长度。长度将始终是直接编码为单个字节的IV的大小。IV将始终具有基础密码块的大小,对于AES,该大小始终为16字节


最后,您应该可以将值为
04h
10h
的字节预先添加到IV.

Hi。事实上,我已经找到了一种解决方案(这是相当不优雅的)。我发现在
iv
字节前面添加两个字节
{4,16}
就可以了。在您的解决方案中,除了前面添加了两个字节
{4,16}
,后面还添加了六个字节,因此解密将失败。好的,我可以看到发生了什么。你看到的是一个ASN.1 DER编码的结构,包含了IV。我从来都不知道这个奇怪的特性;e、 g.密钥不会得到相同的处理。因此,您看到的是编码为八位字节字符串的IV,这是一种ASN.1类型,带有标记
04h
,然后是IV的长度,编码为单个字节,
10h
。当然,说到安全性,我完全是个新手,这实际上是我编程生涯中第一次处理加密库。我想知道的是,假设总是增加了{4,16}个字节,还是将来它可能会咬我的屁股?第一个字节
04h
由定义结构的3位(全部为零)组成,然后是定义标签号的5位,4。这将永远是一样的。第二部分是IV的长度。IV的长度始终是基础密码的块大小。对于AES,这将始终是16字节(但请求块大小)。除非块大小等于或大于128字节,否则可以始终将其编码为单个字节。这是一个很长的解释,说你是安全的:)不是我最喜欢的主题:)但我可能不得不在不久的将来阅读更多关于它的资料。谢谢你的洞察力。