0

私は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に移植する方法についての助けは非常にありがたいです。

ありがとう。

4

1 に答える 1

1

何が起こっているのかというと、cipher.getParameters()呼び出しはのインスタンスを返しますAlgorithmParameters。このインスタンスにgetEncoded()は、次の説明を持つメソッドがあります。

パラメータをプライマリエンコーディング形式で返します。このタイプのパラメーターのASN.1仕様が存在する場合、パラメーターの主要なエンコード形式はASN.1です。

さて、私が知る限り、IVのデフォルトのASN.1 DERエンコーディングのようなものはありませんが、IVは基本的にバイト配列であるため、最も論理的なASN.1エンコーディングはOCTETSTRINGです。DERでエンコードされている場合、このASN.1タイプには、値04hと長さのタグがあります。長さは常に、1バイトを直接エンコードしたIVのサイズになります。IVは、基礎となる暗号のブロックのサイズを常に持ちます。これは、AESの場合は常に16バイトです。

04hしたがって、最後に、値のバイトと10hIVの前に追加することで問題がないはずです。

于 2012-08-22T17:53:41.147 に答える