2017-12-10 1 views
1

안녕하세요 저는 암호문을 CryptoJS 라이브러리 (AES)를 사용하여 암호화 된 암호를 해독하는 java 코드가 있습니다. 이제 다시 plaintext를 암호화 할 javacode를 작성하려고합니다.안드로이드에서 암호화하고 CryptoJS에서 암호 해독

아래 코드를 찾으십시오. 내가 코드를 해독 할 때

try { 
     String secret = "René Über"; 
     String cipherText="U2FsdGVkX1+tsmZvCEFa/iGeSA0K7gvgs9KXeZKwbCDNCs2zPo+BXjvKYLrJutMK+hxTwl/hyaQLOaD7LLIRo2I5fyeRMPnroo6k8N9uwKk="; 

     byte[] cipherData = Base64.decode(cipherText, Base64.DEFAULT); 
     byte[] saltData = Arrays.copyOfRange(cipherData, 8, 16); 

     MessageDigest md5 = MessageDigest.getInstance("MD5"); 
     final byte[][] keyAndIV = GenerateKeyAndIV(32, 16, 1, saltData, secret.getBytes("utf-8"), md5); 
     SecretKeySpec key = new SecretKeySpec(keyAndIV[0], "AES"); 
     IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]); 

     byte[] encrypted = Arrays.copyOfRange(cipherData, 16, cipherData.length); 
     Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     aesCBC.init(Cipher.DECRYPT_MODE, key, iv); 
     byte[] decryptedData = aesCBC.doFinal(encrypted); 
     String decryptedText = new String(decryptedData,"utf-8"); 
     System.out.println("Decrypted "+decryptedText); 
//Here I get right plain text as 
//System.out: Decrypted The quick brown fox jumps over the lazy dog. 


     Cipher abc=Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     abc.init(Cipher.ENCRYPT_MODE,key,iv); 
     byte[] encryptedData=abc.doFinal(decryptedData); 
     String str=Base64.encodeToString(encryptedData,Base64.DEFAULT); 


     System.out.println("encrypted "+str); 

//Here i want the encrypted text as 
// encrypted U2FsdGVkX1+tsmZvCEFa/iGeSA0K7gvgs9KXeZKwbCDNCs2zPo+BXjvKYLrJutMK+hxTwl/hy//aQLOaD7LLIRo2I5fyeRMPnroo6k8N9uwKk= 
//but i receive 
//System.out: encrypted IZ5IDQruC+Cz0pd5krBsIM0KzbM+j4FeO8pgusm60wr6HFPCX+HJpAs5oPssshGjYjl/J5Ew+//eui 



    }catch (Exception e) 
    {} 

나는 올바른 일반 텍스트를 얻을 수 있지만 다시 일반 텍스트를 암호화 할 때 이전과 같은 암호화 된 텍스트를 가져 didnt한다. 도와주세요.

GenerateKeyAndIV 기능 코드 : -

public static byte[][] GenerateKeyAndIV(int keyLength, int ivLength, int iterations, byte[] salt, byte[] password, MessageDigest md) { 

    int digestLength = md.getDigestLength(); 
    int requiredLength = (keyLength + ivLength + digestLength - 1)/digestLength * digestLength; 
    byte[] generatedData = new byte[requiredLength]; 
    int generatedLength = 0; 

    try { 
     md.reset(); 

     // Repeat process until sufficient data has been generated 
     while (generatedLength < keyLength + ivLength) { 

      // Digest data (last digest if available, password data, salt if available) 
      if (generatedLength > 0) 
       md.update(generatedData, generatedLength - digestLength, digestLength); 
      md.update(password); 
      if (salt != null) 
       md.update(salt, 0, 8); 
      md.digest(generatedData, generatedLength, digestLength); 

      // additional rounds 
      for (int i = 1; i < iterations; i++) { 
       md.update(generatedData, generatedLength, digestLength); 
       md.digest(generatedData, generatedLength, digestLength); 
      } 

      generatedLength += digestLength; 
     } 

     // Copy key and IV into separate byte arrays 
     byte[][] result = new byte[2][]; 
     result[0] = Arrays.copyOfRange(generatedData, 0, keyLength); 
     if (ivLength > 0) 
      result[1] = Arrays.copyOfRange(generatedData, keyLength, keyLength + ivLength); 

     return result; 

    } catch (DigestException e) { 
     throw new RuntimeException(e); 

    } finally { 
     // Clean out temporary data 
     Arrays.fill(generatedData, (byte)0); 
    } 
} 
+0

base64에 복사 붙여 넣기 문제가 있습니다. 나는 그것을 작동시키기 위해 많은 문자들을 제거해야만했다. –

+0

예 복사 붙여 넣기입니다 https://stackoverflow.com/questions/41432896/cryptojs-aes-encryption-and-java-aes-decryption 저는 암호화에 익숙하지 않습니다. 이 링크는 암호문을 완벽하게 암호 해독하는 데 도움이됩니다. 그러나 이제 암호화가 걸려 있습니다. – Jayshree

+0

암호를 배우고 싶다고 이미 말한 바 있습니다. 하지만 지금은 사용자에게 더 높은 수준의 API를 제안합니다. 그들은 암호를 사용하여 코드를 작동시키는 것뿐만 아니라 암호를 사용하여 시스템을 안전하게 보호하는 방법을 사용합니다. –

답변

2

귀하의 암호문을 해독 할 때 건너 뛸 시작 부분에서 "Salted__ < 8 바이트 소금>"이 있습니다. OpenSSL 호환 암호문을 만들려면 암호화 모드에서 접두어를 사용해야합니다.

암호화 코드 암호 텍스트를 base64에서 16 진수 디코더로 볼 때 올바른 것으로 보입니다. 하나는 here입니다. 그러나 각 문자는 64 비트 만 포함하고 바이트는 16 자리 (3으로 나눌 수 없음)만큼 이동 했으므로 전체 암호 텍스트가 올바르지 않다는 사실을 알 수 있습니다. 앞 부분에는 16 바이트가 누락되어 있습니다.

+0

시간 내 주셔서 감사합니다. 답을 이해하기 위해 더 공부해야합니다. 암호에 익숙하지 않습니다. 이 라이브러리를 사용하여 문제를 해결했습니다. https://github.com/evgenyneu/aes-crypto-android. 안드로이드에서 cryptojs javascript encrypt/decrypt 함수를 호출했습니다. – Jayshree

관련 문제