我的任务是将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的帮助。
感谢。
答案 0 :(得分:1)
发生的事情是cipher.getParameters()
调用返回AlgorithmParameters
的实例。此实例的方法getEncoded()
具有以下描述:
以主编码格式返回参数。如果存在此类参数的ASN.1规范,则参数的主要编码格式为ASN.1。
现在,据我所知,IV没有默认的ASN.1 DER编码,但由于IV基本上是一个字节数组,因此最符合逻辑的ASN.1编码是OCTET STRING。当DER编码时,此ASN.1类型具有值为04h
的标记,然后是长度。长度将始终以IV的大小直接编码为单个字节。 IV将始终具有底层密码块的大小,对于AES,它总是16个字节。
最后,你可以将值04h
和10h
的字节前置到IV中。