私はこれを解決しようとして一日中髪を引き裂いています...
Java サーバーに接続している iPhone で Objective-C クライアントを実行しています。iPhone は AES を使用してデータを暗号化していますが、サーバーで復号化できません。私は既知のパスフレーズとメッセージ (単一の文字列) を使用しており、iPhone でバイト配列を生成し、Java サーバーで同じキーとメッセージを使用して比較バイト配列を生成していますが、バイト配列は完全に異なります (したがって、 Java 側でデコードされます)。
クライアントは次の設定で CommonCrypto ライブラリを使用しています...
データは、
キーNSData
を使用して単語「メッセージ」を保持しています。これは、上記のエンコーディングを使用して、フレーズ「1234567891123456」を保持しています。アルゴリズムは
オプションです(サーバー上のECBと同等だと思いますか?!)dataUsingEncoding:NSASCIIStringEncoding
NSData
kCCAlgorithmAES128
kCCOptionsPKCS7Padding
サーバーは次のコードを使用しています...
byte[] key = "1234567891123456".getBytes();
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec k = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal("message".getBytes());
しかし、encryptedData のデータは、objective-c コードで生成されているデータと一致しません。バイト配列は完全に異なります。
私が間違っていることは明らかですか?設定はすべて同じだと思います... :(
- 更新 - 要求に応じて....
わかりましたので、ここに行きます....
iPhoneクライアントは次の文字列「メッセージ」を暗号化しています。キー「1234567891123456」を使用します。「1010101010101010」の初期化ベクトルを使用します。AES128を使用し、CBCモード(私が知る限り)とkCCOptionsPKCS7Paddingのオプションを使用しています。
暗号化 (base64 エンコード) の結果は UHIYllDFAXl81ZM7OZPAuA== です。
サーバーは、同じキーと初期化ベクトルを使用して、同じ文字列を暗号化しています。次の Cipher.getInstance("AES/CBC/PKCS5Padding"); を使用しています。
暗号化 (base64 エンコード) の結果は、ALBnFIHysLbvAxjvtNo9vQ== です。
ありがとう。
- 更新 2 - 要求に応じて...
これがiPhoneコードです....
NSData *toencrypt = [@"message" dataUsingEncoding:NSASCIIStringEncoding];
NSData *pass = [@"1234567891123456" dataUsingEncoding:NSASCIIStringEncoding];
NSData *iv = [@"1010101010101010" dataUsingEncoding:NSASCIIStringEncoding];
CCCryptorStatus status = kCCSuccess;
NSData *encrypted = [toencrypt dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:pass initializationVector:iv options:kCCOptionPKCS7Padding error:&status];
NSString *text = [NSString base64StringFromData:encrypted length:[encrypted length]];
暗号化の NSData カテゴリはここから来ています...
http://github.com/AlanQuatermain/aqtoolkit/tree/master/CommonCrypto/
ちなみに、toencrypt、pass、iv にあるバイト配列を確認したところ、サーバーにあるものと一致しています。