2013-04-11 68 views
5

Tôi đang sử dụng lớp mã hóa trong Mục tiêu C cho ứng dụng iPhone của mình nhưng tôi đang cố gắng để có được cùng chức năng hoạt động trong JAVA từ ứng dụng Android của tôi. Mã mã hóa của tôi là bên dưới:Mã hóa chuỗi 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]; 

Tôi đã cố gắng sao chép nó trong JAVA nhưng tôi nhận được một chuỗi khác khi mã hóa cùng một dữ liệu. Vì vậy, tôi đang làm một cái gì đó sai, nhưng tôi không thể tìm ra nó. Đây là mã JAVA của tôi:

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

Mọi người có thể thấy tôi đang đi đâu không?

Dựa trên các ý kiến ​​dưới đây tôi đã thêm getBytes nhưng chuỗi sản xuất vẫn còn khác nhau:

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

Bạn cần phải xác định bộ ký tự trong 'getBytes()' nếu bạn muốn các chuỗi phù hợp. –

Trả lời

7

Đây là một mẫu mã hóa và giải mã:

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

Để mã hóa:

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

để giải mã

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

Thnak bạn cảm ơn bạn cảm ơn bạn! Hoàn hảo. – user1661369

+0

@ wangyif2 Lớp nào là EncUtil? – RyPope

+0

@RyPope, Nó sẽ là lớp w/e phương thức encryptMsg nằm trong (Hoàn toàn tùy thuộc vào bạn). – wangyif2

0

Thay vì sử dụng ECB, bạn nên sử dụng CBC hoặc CTR nếu có thể. ECB is insecure.

Có vẻ như mã Mục tiêu-C của bạn đang sử dụng mã hóa UTF-8, nhưng bạn không chỉ định mã này trong mã Java của mình. Sử dụng getBytes("UTF-8").

+0

Cảm ơn sự giúp đỡ của mọi người. Tôi đã không sử dụng getBytes vì ​​vậy tôi đã thay đổi mã của tôi để sử dụng getBytes nhưng vẫn không có may mắn. – user1661369

0

Một điều mà tôi đã nhận thấy đã gây ra sự cố trong quá khứ là chuỗi iOS đang được mã hóa thực sự là "Hello World\0", ví dụ: chuỗi được mã hóa với một giá trị bổ sung ở cuối. vì vậy, hãy thử thêm một số \0 vào cuối chuỗi của bạn bằng Java và xem nó có tạo ra kết quả tương tự hay không.

Ngoài ra, bước URLEncoder trên java có thể giới thiệu các ký tự điều khiển bổ sung và những thứ khác không hiện diện ở phía iOS. Nó có thể là đáng giá để so sánh các văn bản sau này với các văn bản đi vào bước mã hóa iOS để đảm bảo rằng chúng giống hệt nhau

+0

Đã xóa bộ mã hóa URL và sử dụng phương thức getBytes như được đề xuất nhưng vẫn không có niềm vui. – user1661369

+0

bạn đã thử thêm '\ 0' vào cuối chuỗi bạn đang nhận được từ trường mật khẩu chưa? –

+0

Không có niềm vui, tôi đã thử thêm \ 0 vào cuối chuỗi nhưng chuỗi được mã hóa vẫn khác nhau – user1661369