16

私はこれを解決しようとして一日中髪を引き裂いています...

Java サーバーに接続している iPhone で Objective-C クライアントを実行しています。iPhone は AES を使用してデータを暗号化していますが、サーバーで復号化できません。私は既知のパスフレーズとメッセージ (単一の文字列) を使用しており、iPhone でバイト配列を生成し、Java サーバーで同じキーとメッセージを使用して比較バイト配列を生成していますが、バイト配列は完全に異なります (したがって、 Java 側でデコードされます)。

クライアントは次の設定で CommonCrypto ライブラリを使用しています...

データは、 キーNSDataを使用して単語「メッセージ」を保持しています。これは、上記のエンコーディングを使用して、フレーズ「1234567891123456」を保持しています。アルゴリズムは オプションです(サーバー上のECBと同等だと思いますか?!)dataUsingEncoding:NSASCIIStringEncodingNSDatakCCAlgorithmAES128kCCOptionsPKCS7Padding

サーバーは次のコードを使用しています...

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 にあるバイト配列を確認したところ、サーバーにあるものと一致しています。

4

5 に答える 5

3

これは私の領域ではありませんが、あなたが持っているクライアントではあるが、あなたがPKCS7持っているサーバーではそうですPKCS5

于 2009-10-28T18:07:09.917 に答える
2

iPhone は AES でどのモードを使用していますか? 何もリストしていないので、おそらくチェーン (ECB) を使用していないことを意味します。

ただし、Java 側では、CBC を使用していますが、初期化ベクトルを指定していません。それは間違いです。本当に CBC を使用している場合、暗号化中に使用された IV が必要です。IV は秘密ではありません。暗号文と一緒に送信できます。

実際に ECB を使用している場合、IV はありませんが、Java が間違ったモードを指定しています。

于 2009-10-28T18:23:49.490 に答える
0

サンプルに基づいて、サーバーは正しく実行していますが、クライアントはそうではありません。

データを見ると、キーが間違っていると思います。iPhoneコード、特に「1234567891123456」からあなたのキーに行くコードを見せてください。

于 2009-10-29T13:11:14.177 に答える
0

最近、別のプロジェクトでこれに出くわしました。問題は、キーが 1 バイト長すぎて、メソッドchar内のバッファーに収まらないことでした。dataEncryptedUsingAlgorithm

問題は、 のgetBytesメソッドNSStringがソフト フェイルだったことです。ほとんどの文字列をバッファにコピーしますが、キーが 1 バイト長すぎるため、最初の文字をNUL(char 0) に設定することで操作を失敗として「マーク」します。

Xcode でそのメソッドにステップ インし、キー char[16] バッファがどのように見えるかを確認します。これと同じ問題があり、内容が{ 0, '2', '3', '4', ... }.

于 2010-06-22T12:43:46.680 に答える