2017-12-10 6 views
1

Hallo Ich habe Java-Code, die verschlüsselten Chiffretext mit CryptoJS-Bibliothek (AES) entschlüsseln. Nun wollte ich den Java-Code schreiben, der den Klartext wieder verschlüsselt.verschlüsseln in Android und entschlüsseln in CryptoJS

Hier finden Sie den folgenden Code.

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) 
    {} 

Wenn ich den Code zu entschlüsseln bekomme ich richtig Plain Text, aber wenn ich wieder den Klartext verschlüsseln Ich habe nicht den verschlüsselten Text als vorheriges erhalten. Bitte Hilfe.

GenerateKeyAndIV Funktionscode: -

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

Ihr base64 hat ein Copy-Paste-Problem; Ich musste einige Zeichen entfernen, damit es funktionierte. –

+0

Ja Es ist Kopie einfügen von https://stackoverflow.com/questions/41432896/cryptojs-aes-encryption-and-java-aes-decryption Ich bin nicht vertraut mit Kryptografie. Dieser Link hilft mir, den Chiffretext perfekt zu entschlüsseln. Aber jetzt stecke ich in der Verschlüsselung fest – Jayshree

+0

Sie haben bereits angegeben, dass Sie Krypto lernen wollen. Aber ich würde vorschlagen, dass Sie jetzt eine höhere API verwenden. Die Idee ist, Krypto zu verwenden, um Ihr System zu sichern, nicht nur, um Ihren Code zum Laufen zu bringen. –

Antwort

2

Ihr verschlüsselter Text hat "Salted__ < 8 Byte Salz>" am Anfang, die Sie überspringen, wenn die Entschlüsselung. Sie müssen dasselbe in Ihrem Verschlüsselungsmodus voranstellen, wenn Sie OpenSSL-kompatiblen Chiffretext erstellen möchten.

Ihr Verschlüsselungscode-Chiffretext scheint korrekt zu sein, wenn Sie ihn in einem base64-to-hex-Decoder anzeigen, z. der eine zur Verfügung gestellte here. Da jedes Zeichen jedoch nur 64 Bits enthält und die Bytes 16 Stellen verschoben haben (was nicht durch 3 teilbar ist), ist es nur so, dass Ihr gesamter Chiffretext falsch ist, während vorne nur 16 Bytes fehlen.

+0

Vielen Dank für Ihre Zeit. Ich muss mehr studieren, um Ihre Antwort zu verstehen. Ich bin nicht mit Kryptographie vertraut. Ich habe mein Problem mit dieser Bibliothek gelöst. https://github.com/evgenyneu/aes-crypto-android. Ich rief die Cryptojs JavaScript-Funktion zum Verschlüsseln/Entschlüsseln von Android. – Jayshree

Verwandte Themen