2016-11-09 1 views
0

Это, наверное, самая странная вещь, которая со мной произошла. Код отлично работает в Eclipse, но , если я пытаюсь использовать его в Android Studio, он терпит неудачу. Через 2 дня я думаю, что это может быть что-то связанное с библиотекой Commons-Codec, но на данный момент, и после обыска в Интернете, я не могу найти решение моей проблемы. Я буквально не спал прошлой ночью, пытаясь найти решение.Java Encryption с AES-RSA работает в Eclipse, но не в Android Studio

Вот мой код, я вставил только то, что, по моему мнению, имеет значение, но если вам нужен весь код, дайте мне знать.

Это серверная часть, работающая на сервере Ubuntu.

private String cifrarClaveAES(String clavepub) throws Exception{ 


        byte[] sigBytes2 = new Base64().decode(clavepub); 

        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes2); 
        KeyFactory keyFact = KeyFactory.getInstance("RSA"); 
        PublicKey pubKey2 = keyFact.generatePublic(x509KeySpec); 

        try { 
          Cipher rsa; 
          rsa = Cipher.getInstance("RSA"); 
          rsa.init(Cipher.ENCRYPT_MODE, pubKey2); 



          byte[] array = rsa.doFinal(miclaveAES.getBytes("UTF-8")); 

          String prueba = new String(new Base64().encode(array), "UTF-8"); 

          return prueba; 
         } catch (Exception e) { 
          System.out.println(e.toString()); 
         } 
         return null; 
       } 
      private String desencriptar(String criptograma, SecretKey clave){ 
        try{ 
        Cipher c = Cipher.getInstance("AES"); 
        c.init(Cipher.DECRYPT_MODE, clave); 
        byte[] decVal = new Base64().decode(criptograma.getBytes("UTF-8")); 

        byte[] mensaje = c.doFinal(decVal); 
        return new String(mensaje, "UTF-8"); 
        }catch (Exception e){ 
         System.out.println("Error al desencriptar"); 
         return null; 
        } 


       } 

Это работает на стороне клиента (Android APP)

частная строка clavePublicaToString() {// PublicKeyToString

PublicKey miclaveRSA = claveRSA.getPublic(); 
    byte[] array = miclaveRSA.getEncoded(); 
    String clavePublica = ""; 


    try { 
     clavePublica = new String(new Base64().encode(array), "UTF-8"); 



    System.out.println(clavePublica); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
     return null; 
    } 

    return clavePublica; 
} 
public String descifrarclaveAEScifrada(String mstring) { 

    byte[] buffer = new byte[0]; 
    try { 
     buffer = mstring.getBytes("UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
    try { 
     Cipher rsa; 
     rsa = Cipher.getInstance("RSA"); 
     rsa.init(Cipher.DECRYPT_MODE, claveRSA.getPrivate()); 
     byte[] utf8; 
     byte[] depaso = new Base64().decode(buffer); 

     utf8 = rsa.doFinal(depaso); 
     return new String(utf8, "UTF-8"); 
    } catch (Exception e) { 

     System.out.println(e.toString()); 
    } 
    return null; 
} 

public String encriptarAES(String mensaje, SecretKey clave){ 

    Cipher c = null; 
    byte[] criptograma = null; 
    try { 
      c = Cipher.getInstance("AES"); 

     c.init(Cipher.ENCRYPT_MODE, clave); 
     byte[] encVal = c.doFinal(mensaje.getBytes("UTF-8")); 


     criptograma = new Base64().encode(encVal); 

    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } catch (BadPaddingException e) { 
     e.printStackTrace(); 
    } catch (IllegalBlockSizeException e) { 
     e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 


    return new String(criptograma, Charset.defaultCharset()); 


} 

А вот выход в Android Studio. Выходное изменение к некоторым читаемым символам для нечитаемых символов, никогда одинаковой длины.

https://gyazo.com/574be22d0ef8f8b56f7fac805e09be33

Вывод должен быть: ThisIsMyAESkey

ответ

0

Ваша проблема связана не является достаточно точным при определении алгоритмов, которые вы используете.

При предоставлении имен шифров в виде строк, например. «RSA» вы всегда должны быть как можно более конкретными. Это означает включение режима блокировки и режима заполнения.

Я не знаю, какой режим заполнения вы ожидаете, но будьте конкретны. Попробуйте использовать RSA/ECB/PKCS1Padding и AES/ECB/PKCS5Padding.

Это приведет к тому, что ваш код будет работать, но он не в действительности безопасен. Ваш зашифрованный текст не аутентифицирован и поэтому может быть изменен, в настоящее время вы используете режим ECB (например, нет IV), и ваше приложение не имеет прямой секретности. У вас есть длинный путь, чтобы сделать ваш код безопасным.

+0

Спасибо за ваш комментарий, я попробую его и отчитаюсь завтра. Я младший, поэтому мои знания в этой области (особенно криптография) очень ограничены –

+0

@PedroPPL. Все в порядке, каждый должен где-то начать! Однако, если вы намерены использовать этот код в рабочей среде, вам, вероятно, следует рассмотреть возможность его утилизации и вместо этого использовать TLS. –

+0

Привет, после некоторого сна (я действительно устал вчера) и попробую то, что вы сказали мне, что он работает как шарм. Я также обнаружил, что я не вызывал метод дешифрования в своем коде. Однако после того, как вы сказали мне, что мой код находится далеко за безопасностью, я теперь изучаю TLS и SSL. Большое спасибо. Это правда, что StackOverflow - это потрясающее место. –