2013-04-11 19 views
5

Objective Cの暗号化クラスを自分のiPhoneアプリに使用していますが、AndroidのアプリからJAVAで同じ機能を使用するのに苦労しています。私の暗号化コードは以下の通りです:Java文字列を暗号化

NSString * _secret = @"password"; 
NSString * _key = @"1428324560542678"; 

StringEncryption *crypto = [[StringEncryption alloc] init]; 
NSData *_secretData = [_secret dataUsingEncoding:NSUTF8StringEncoding]; 
CCOptions padding = kCCOptionPKCS7Padding; 
NSData *encryptedData = [crypto encrypt:_secretData key:[_key dataUsingEncoding:NSUTF8StringEncoding] padding:&padding]; 

私はJAVAでそれを複製しようとしましたが、私は同じデータをエンコードするときに別の文字列を取得します。だから私は何か間違っているが、私はそれを理解できない。私のJAVAコードは以下の通りです:

byte[] key = "1428324560542678".getBytes(); 

Cipher c = null; 
      try { 
       c = Cipher.getInstance("AES/ECB/PKCS7Padding"); 
      } catch (NoSuchAlgorithmException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (NoSuchPaddingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

SecretKeySpec k = new SecretKeySpec(key, "AES"); 
      try { 
       c.init(Cipher.ENCRYPT_MODE, k); 
      } catch (InvalidKeyException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

    try { 
     EditText tv1passwordText = (EditText) findViewById(R.id.password); 
     String password = URLEncoder.encode(tv1passwordText.getText().toString(), "UTF-8"); 

      byte[] encryptedData = c.doFinal(password.getBytes()); 

どこが間違っているのでしょうか? I以下のコメントをもとに

はGetBytesメソッドを追加しましたが、生産の文字列はまだ異なっている:

byte[] key = null; 
      try { 
       key = "1428324560542678".getBytes("UTF-8"); 
      } catch (UnsupportedEncodingException e2) { 
       // TODO Auto-generated catch block 
       e2.printStackTrace(); 
      } 

      Cipher c = null; 
      try { 
       c = Cipher.getInstance("AES/ECB/PKCS7Padding"); 
      } catch (NoSuchAlgorithmException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (NoSuchPaddingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      SecretKeySpec k = new SecretKeySpec(key, "AES"); 
      try { 
       c.init(Cipher.ENCRYPT_MODE, k); 
      } catch (InvalidKeyException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      try { 
       EditText tv1passwordText = (EditText) findViewById(R.id.password); 

       byte[] password = tv1passwordText.getText().toString().getBytes("UTF-8"); 

       byte[] encryptedData = c.doFinal(password); 
+0

復号化します文字列が一致するようにします。 –

答えて

7

であることを保証するために、iOSの暗号化段階に入ると、この後のテキストを比較する価値があるかもしれ暗号化と復号化のサンプルです:

public static SecretKey generateKey() throws NoSuchAlgorithmException, InvalidKeySpecException { 
    return secret = new SecretKeySpec(password.getBytes(), "AES"); 
} 

public static byte[] encryptMsg(String message, SecretKey secret) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidParameterSpecException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { 
/* Encrypt the message. */ 
    Cipher cipher = null; 
    cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
    cipher.init(Cipher.ENCRYPT_MODE, secret); 
    byte[] cipherText = cipher.doFinal(message.getBytes("UTF-8")); 
    return cipherText; 
} 

public static String decryptMsg(byte[] cipherText, SecretKey secret) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidParameterSpecException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException { 

    /* Decrypt the message, given derived encContentValues and initialization vector. */ 
    Cipher cipher = null; 
    cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
    cipher.init(Cipher.DECRYPT_MODE, secret); 
    String decryptString = new String(cipher.doFinal(cipherText), "UTF-8"); 
    return decryptString; 
} 

暗号化するには:

SecretKey secret = EncUtil.generateKey(); 
    EncUtil.encryptMsg(<String to Encrypt>, secret)) 

あなたがあれば `)(` GetBytesメソッドで文字セットを指定する必要が

EncUtil.decryptMsg(<byte[]>, secret)) 
+0

Thnakありがとう、ありがとう!完璧。 – user1661369

+0

@ wangyif2 EncUtilとはどのようなクラスですか? – RyPope

+0

@RyPope、encryptMsgメソッドが(完全にあなた次第)座っているw/eクラスになります。 – wangyif2

0

代わりにECBを使用するのではなく、あなたが可能な場合はCBCまたはCTRを使用するべきです。 ECB is insecure

Objective-CコードがUTF-8エンコーディングを使用しているようですが、Javaコードでこれを指定していません。 getBytes("UTF-8")を使用してください。

+0

皆様のご協力ありがとうございます。 getBytesを使用していないので、getBytesを使用するようにコードを変更しましたが、まだ運がありません。 – user1661369

0

過去に問題を引き起こしていたことは、実際には暗号化されるiOS文字列が"Hello World\0"であることです。たとえば、最後に追加のヌル文字で暗号化される文字列などです。したがって、文字列の末尾にJavaで\0を追加して、同じ結果が得られるかどうかを確認してください。

また、javaのステップでは、追加の制御文字など、iOS側に存在しないものが導入されている可能性があります。テキストは、彼らがここでまったく同じ

+0

URLエンコーダを削除し、getBytesメソッドを推奨どおりに使用しましたが、まだ喜んではいません。 – user1661369

+0

パスワードフィールドから取得している文字列の最後に '\ 0'を追加しようとしましたか? –

+0

いいえ、私は文字列の最後に\ 0を追加しようとしましたが、エンコードされた文字列はまだ異なっていました – user1661369

関連する問題