2013-04-11 15 views
5

iPhone uygulamam için Objective C'deki şifreleme sınıfını kullanıyorum ancak Android uygulamasından JAVA'da aynı işlevi çalıştırmaya çalışıyorum. Ben JAVA bunu çoğaltmak için çalıştıkJava dize şifrelemek

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

ama aynı veriyi kodlamak zaman ben farklı bir dize olsun: My şifreleme kod aşağıda belirtilmiştir. Yani yanlış bir şey yapıyorum ama anlayamıyorum. İşte benim JAVA kodum:

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

Nerede yanlış gittiğimi gören var mı? Ben getBytes ama üretilen dizeleri eklenen aşağıda açıklamalara dayanarak

hala farklıdır:

yerine ECB kullanmanın
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

şifresini Dizelerin eşleşmesini istiyorsun. –

cevap

7

şifreleme ve şifre çözme bir örneğidir:

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

şifrelemek için:

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

Sen eğer `) (getBytes` ayarlanan karakter belirtmeniz gerekir

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

Thnak teşekkür ederim teşekkür ederim! Mükemmel. – user1661369

+0

@ wangyif2 EncUtil sınıfı ne? – RyPope

+0

@RyPope, encryptMsg yönteminin gireceği sınıftır (Tamamen size kalmış). – wangyif2

0

, sen mümkünse CBC veya TO kullanmalisin. ECB is insecure.

Nesne-C kodunuzun UTF-8 kodlamasını kullanıyor gibi görünüyor, ancak bunu Java kodunuzda belirtmiyorsunuz. getBytes("UTF-8") kullanın.

+0

Yardımlarınız için teşekkürler herkese. GetBytes kullanmamıştım, böylece kodumu getBytes kullanmak için değiştirdim ama yine de hayır şansı. – user1661369

0

Geçmişte sorunlara neden olduğunu fark ettiğim bir şey, şifrelenmiş olan iOS dizesinin aslında "Hello World\0" olmasıdır; örneğin, dizenin sonunda ek bir boş değerle şifrelenmesi. Bu nedenle, Java'daki dizenizin sonuna bir \0 eklemeyi deneyin ve aynı sonuçları üretip üretmediğini görün. Ayrıca, URLEncoder java adımında ek olarak, iOS tarafında bulunmayan ek kontrol karakterleri ve diğer şeyler de tanıtılıyor olabilir. Onlar tam olmasını sağlamak için metin iOS şifreleme adımı girecek olan bundan sonra metni karşılaştırmak yararlı olabilir aynı Burada

+0

URL kodlayıcısını kaldırdı ve önerilen şekilde getBytes yöntemini kullandı ancak yine de sevinçten yoksun. – user1661369

+0

Şifre alanından aldığınız dizenin sonuna '\ 0' eklemeyi denediniz mi? –

+0

Sevinç yok, dizinin sonuna \ 0 eklemeyi denedim ama şifreli string hala farklıdı – user1661369