2017-12-10 19 views
1

こんにちは私はCryptoJSライブラリ(AES)を使用して暗号化された暗号文を解読するjavaコードを持っています。 私は再び平文を暗号化するjavacodeを書きたいと思っていました。Androidで暗号化し、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で割り切れない)になっているため、暗号文全体が正しくないことがわかります。

+0

ありがとうございました。 私はあなたの答えを理解するためにもっと勉強する必要があります。私は暗号に精通していません。 私はこのライブラリを使用して私の問題を解決しました。 https://github.com/evgenyneu/aes-crypto-android 私はアンドロイドからcryptojs javascriptの暗号化/復号化機能を呼び出しました。 – Jayshree

関連する問題