2013-04-11 4 views
5

Ich verwende die Verschlüsselungsklasse in Objective C für meine iPhone App, aber ich habe Schwierigkeiten, die gleiche Funktionalität in JAVA von meiner Android App zu bekommen. Mein Verschlüsselungscode ist unten:Java string encrypt

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]; 

Ich habe versucht, es in JAVA zu replizieren, aber ich erhalte eine andere Zeichenfolge, wenn ich die gleichen Daten kodieren. Also mache ich etwas falsch, aber ich kann es nicht herausfinden. Hier ist mein JAVA-Code:

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()); 

Kann jemand sehen, wo ich falsch liege?

Basierend auf den Kommentaren unten Ich produzierte getBytes aber die Saiten hinzugefügt sind noch anders: wenn möglich

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

Sie müssen die Zeichen in 'getBytes gesetzt, um anzugeben()', wenn Sie möchten, dass die Zeichenfolgen übereinstimmen. –

Antwort

7

Hier ist ein Beispiel für die Verschlüsselung und Entschlüsselung:

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; 
} 

zu verschlüsseln:

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

entschlüsseln

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

Thnak du danke dir danke! Perfekt. – user1661369

+0

@ wangyif2 Welche Klasse ist EncUtil? – RyPope

+0

@RyPope, Es wird w/e Klasse sein, in der die Methode encryptMsg sitzt (ganz Ihnen überlassen). – wangyif2

0

Statt EZB zu verwenden, Sie sollten CBC oder CTR verwenden. ECB is insecure.

Es scheint, dass Ihr Objective-C-Code die UTF-8-Codierung verwendet, aber Sie geben dies nicht in Ihrem Java-Code an. Verwenden Sie getBytes("UTF-8").

+0

Vielen Dank für Ihre Hilfe. Ich hatte getBytes nicht benutzt, also habe ich meinen Code geändert, um getBytes zu verwenden, aber immer noch kein Glück. – user1661369

0

Eine Sache, die ich festgestellt habe, dass in der Vergangenheit Probleme verursacht hat, ist, dass die iOS-Zeichenfolge, die verschlüsselt wird, tatsächlich "Hello World\0" ist, zB die zu verschlüsselnde Zeichenfolge mit einem zusätzlichen Null am Ende. Versuchen Sie also, in Java ein \0 an das Ende Ihrer Zeichenfolge hinzuzufügen, und sehen Sie, ob es die gleichen Ergebnisse liefert.

Darüber hinaus kann die URLEncoder Schritt auf Java zusätzliche Steuerzeichen und andere Dinge, die nicht auf der iOS-Seite vorhanden sind. Es kann sich lohnen, den Text danach mit dem Text geht in die iOS-Verschlüsselung Schritt zu vergleichen, um sicherzustellen, dass sie genau die gleichen sind

+0

Der URL-Encoder wurde entfernt und die getBytes-Methode wurde wie vorgeschlagen verwendet, aber immer noch keine Freude. – user1661369

+0

haben Sie versucht, am Ende der Zeichenfolge, die Sie aus dem Passwortfeld erhalten, ein '\ 0' hinzuzufügen? –

+0

Keine Freude, ich habe versucht, die \ 0 an das Ende der Zeichenfolge, aber die codierte Zeichenfolge war immer noch anders – user1661369