2017-08-29 6 views
0

私はアンドロイドアプリで暗号化を実装する必要があります。 Web開発者はCryptoJsライブラリを使用しています。 Encryption alogはAES256暗号化を意味します。CryptoJs暗号化がアンドロイドで動作していません

iOSとAndroidの両方のプラットフォームで異なる文字列が使用され、iOSはwebで受け入れられます。これはサンプル文字列でも同じです。私も使用

private void newEnc() { 

     String secret = "[email protected]@ps"; 
     String cipherText = "{\"device_type\":\"iOS\",\"email\" : \"[email protected]\",\"device_id\" : \"14105DA4-CEE5-431E-96A2-2331CDA7F062\",\"password\" : \"123456\",\"device_token\" : \"B44777563552882EC3139A0317E401B55D6FC699D0AC3D279F392927CAF9B566\"}"; 


     KeyGenerator kgen = null; 
     try { 
      kgen = KeyGenerator.getInstance("AES"); 
      SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); 
      sr.setSeed(secret.getBytes("UTF8")); 
      kgen.init(256, sr); 
      SecretKey skey = kgen.generateKey(); 

      Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      SecretKeySpec skeySpec = new SecretKeySpec(skey.getEncoded(), "AES"); 
      c.init(Cipher.ENCRYPT_MODE, skeySpec); 
      byte[] decrypted = c.doFinal(cipherText.getBytes()); 

      System.out.println(Base64.encodeToString(decrypted, Base64.NO_WRAP)); 

      // decrypted = Base64.encodeBase64(decrypted); 
      // byte[] iv = Base64.encodeBase64(c.getIV()); 
      // Log.e("encryptString", new String(decrypted)); 
      // Log.d("encryptString iv", new String(iv)); 


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


    } 

::私は、コードスニペットの下に使用しています

は(2つの異なる切り抜いた機能があります)

private void enctest(String cipherText) { 


     String secret = "[email protected]@ps"; 
     // String cipherText = "{\"device_type\":\"iOS\",\"email\" : \"[email protected]\",\"device_id\" : \"14105DA4-CEE5-431E-96A2-2331CDA7F062\",\"password\" : \"123456\",\"device_token\" : \"B44777563552882EC3139A0317E401B55D6FC699D0AC3D279F392927CAF9B566\"}"; 


     MessageDigest md5 = null; 
     try { 

      // String cipherText = "U2FsdGVkX1+tsmZvCEFa/iGeSA0K7gvgs9KXeZKwbCDNCs2zPo+BXjvKYLrJutMK+hxTwl/hyaQLOaD7LLIRo2I5fyeRMPnroo6k8N9uwKk="; 

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

      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.ENCRYPT_MODE, key, iv); 
      byte[] decryptedData = aesCBC.doFinal(cipherText.getBytes("UTF-8")); 


//   String plainText = "Hello, World! This is a Java/Javascript AES test."; 
//   SecretKey key = new SecretKeySpec(
//     Base64.decodeBase64("u/Gu5posvwDsXUnV5Zaq4g=="), "AES"); 
//   AlgorithmParameterSpec iv = new IvParameterSpec(
//     Base64.decodeBase64("5D9r9ZVzEYYgha93/aUK2w==")); 
//   Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
//   cipher.init(Cipher.ENCRYPT_MODE, key, iv); 
//   System.out.println(Base64.encodeBase64String(cipher.doFinal(
//     plainText.getBytes("UTF-8")))); 


      // String decryptedText = new String(decryptedData, "UTF-8"); 

      System.out.println(Base64.encodeToString(decryptedData, Base64.NO_WRAP)); 

      // enctest(decryptedText); 

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


    } 

しかし、どれも同じ結果が得られません。

のiOSに彼らは私が私たちの暗号化された文字列の両方が一致していることを何をすべきhttps://github.com/etienne-martin/CryptoJS.swift

を使用しています。

+0

すべてがコードにあります – theLazyFinder

答えて

0

実際のcipherText(同じ変数名の文字列と混同しないでください)はフォーマットされ、「Salted__」とおそらく暗号化パラメータで始まります。 2つの異なる機能は、異なるフォーマットで異なる出力を作成します。同じ出力を生成することはできません。 cipherText混乱

注1:

// String cipherText = "{\"device_type\":\"iOS\",\"email\" : \"[email protected]\",\"device_id\" : \"14105DA4-CEE5-431E-96A2-2331CDA7F062\",\"password\" : \"123456\",\"device_token\" : \"B44777563552882EC3139A0317E401B55D6FC699D0AC3D279F392927CAF9B566\"}"; 
// String cipherText = "U2FsdGVkX1+tsmZvCEFa/iGeSA0K7gvgs9KXeZKwbCDNCs2zPo+BXjvKYLrJutMK+hxTwl/hyaQLOaD7LLIRo2I5fyeRMPnroo6k8N9uwKk="; 
 

注2:
Base64ではそれがコンピュータのために設計され、ヒトのためのように非有用であるが、Hexが直接ビットの人間とコンピュータのためのものですバイト対応。

関連する問題