3

同じパスワードを使用してsetupメソッドを実行するたびに、毎回異なるキー結果が得られます。キーの結果を使用して、不要な復号化を防ぐために、復号化パスワードが正しいかどうかを確認しています。

次のコードをJavaで実行しましたが、問題はありませんが、Androidでは別のキーを生成する際に問題が発生します。誰かが私に問題とは何か、そしてこれを修正する方法を教えてもらえますか?AndroidとJavaに共通のソフトウェアが欲しいのですが。

Androidでプログラムを実行すると、キーorg.bouncycastle.jce.provider.JCEPBEKEY@12345678を取得します。

プログラムをJavaで実行すると、キーcom.sun.crypto.Provider.PBEKey@12345678を取得します。

private static byte[] bytes;
  Cipher ecipher;
  Cipher dcipher;

  // 8-byte Salt
  byte[] salt = {
      (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
      (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
  };

  // Iteration count
  int iterationCount = 19;

  public String setup(String passPhrase) 
  {
      String output = null;
      try {
          // Create the key
          KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
          SecretKey key = SecretKeyFactory.getInstance(
              "PBEWithMD5AndDES").generateSecret(keySpec);

          ecipher = Cipher.getInstance(key.getAlgorithm());
          dcipher = Cipher.getInstance(key.getAlgorithm());

          // Prepare the parameter to the ciphers
          AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

          // Create the ciphers
          ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
          dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

          // print key
          System.out.println("key  = " + key);
          System.out.println("paramSpec  = " + paramSpec);


          output = key.toString();
      //    showToast("setting up key " + output);
      //    showToast("key size " + output.length());
          System.out.println("key Size " + output.length());

      } catch (java.security.InvalidAlgorithmParameterException e) {
      } catch (java.security.spec.InvalidKeySpecException e) {
      } catch (javax.crypto.NoSuchPaddingException e) {
      } catch (java.security.NoSuchAlgorithmException e) {
      } catch (java.security.InvalidKeyException e) {
      }

      return output;
  }
4

3 に答える 3

1

代わりに、javax.xmllibを使用できます。

static String byteToHex(byte[] keyBytes) 
{
    StringBuilder sb = new StringBuilder();
    for (byte b : keyBytes) {
        sb.append(String.format("%1$02X", b));
    }

    return sb.toString();
}
于 2012-10-12T07:35:23.017 に答える
1

たぶん私は質問を誤解していますが、暗号化を行う一連のバイトとして、キーの実際の内容-キーの実際の値が必要なようです。

テキスト org.bouncycastle.jce.provider.JCEPBEKEY@12345678 は、キーの実際の値ではありません。これは、JCEPBEKEY クラスがデフォルトの toString 実装をオーバーライドしなかったことを意味します。キーの実際の値をバイト配列として取得するには、次を使用します

byte [] keyBytes = key.getEncoded();

【更新・撤回】

JVM では、次を使用してこれを 16 進文字列として出力します。

String keyString = javax.xml.bind.DatatypeConverter.printHexBinary(keyBytes);

ただし、前述のとおり、これは Android では使用できません。@ user1024882 からの回答は、どちらのプラットフォームでも機能する優れたアプローチのように見えます。

于 2012-10-12T04:37:32.630 に答える
1

行を変更します。

SecretKey key = SecretKeyFactory.getInstance(
              "PBEWithMD5AndDES").generateSecret(keySpec);

SecretKey key = SecretKeyFactory.getInstance(
              "PBEWithMD5AndDES","BC").generateSecret(keySpec);

このように、暗号プロバイダー (弾む城) を具体的に要求します。注: 弾む城プロバイダーも VM に追加する必要があります。

于 2012-10-12T04:26:57.707 に答える