我的任务是将 AES 加密从 Java 移植到 Objective-C。我无权访问发生解密的服务器代码。使用FBEncryptor ,我成功地在 Objective-C 中对字符串进行了简单的 AES 加密,并在 Java 中对其进行了解密,反之亦然。
但是,当我尝试将 Objective-C 中的加密数据发送到服务器(同样,我无权访问)时,服务器向我发送了“DER 输入不是八位字节字符串”错误。我认为这段 Java 代码(我无法在 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()
调用返回 AlgorithmParameters
的实例。该实例有一个方法getEncoded()
具有以下描述:
Returns the parameters in their primary encoding format. The primary encoding format for parameters is ASN.1, if an ASN.1 specification for this type of parameters exists.
现在,据我所知,IV 不存在默认的 ASN.1 DER 编码,但由于 IV 基本上是字节数组,因此最合乎逻辑的 ASN.1 编码是 OCTET STRING。当 DER 编码时,此 ASN.1 类型具有一个值为 04h
的标记,然后是长度。长度始终是直接编码单个字节的 IV 的大小。 IV 将始终具有底层密码 block 的大小,对于 AES 始终为 16 字节。
最后,您应该可以将值为 04h
和 10h
的字节添加到 IV 之前。
关于java - 将 AES 加密从 Java 移植到 Objective-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12076851/