Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用相同密码在Android中获得不同的加密密钥结果_Java_Android - Fatal编程技术网

Java 使用相同密码在Android中获得不同的加密密钥结果

Java 使用相同密码在Android中获得不同的加密密钥结果,java,android,Java,Android,每次使用相同的密码运行setup方法时,每次都会得到不同的密钥结果。我使用密钥结果检查解密密码是否正确,以防止不必要的解密 我用java运行了下面的代码,没有问题,但在Android中,生成不同的密钥是个问题。有人能告诉我是什么问题以及如何解决这个问题吗。我想要Android和Java之间的通用软件 当我在安卓系统中运行程序时,我得到了密钥org.bouncycastle.jce.provider。JCEPBEKEY@12345678 当我用java运行程序时,我得到了密钥 com.sun.cr

每次使用相同的密码运行setup方法时,每次都会得到不同的密钥结果。我使用密钥结果检查解密密码是否正确,以防止不必要的解密

我用java运行了下面的代码,没有问题,但在Android中,生成不同的密钥是个问题。有人能告诉我是什么问题以及如何解决这个问题吗。我想要Android和Java之间的通用软件

当我在安卓系统中运行程序时,我得到了密钥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;
  }
更改行:

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

像这样,您特别要求加密提供商(bouncy castle)
注意:您还必须将bouncycastle提供程序添加到您的VM中。

也许我误解了这个问题,但听起来您需要密钥的实际内容-密钥的实际值,作为字节序列,这将进行加密

文本org.bounchycastle.jce.provider。JCEPBEKEY@12345678不是钥匙的真正价值。这仅仅意味着JCEPBEKEY类没有覆盖默认的toString实现。要获取作为字节数组的键的实际值,请使用

byte [] keyBytes = key.getEncoded();
[更新/收回]

在JVM上,我将使用以下命令将其打印为十六进制字符串:

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

但是如上所述,这在Android上是不可用的。@user1024882给出的答案看起来是一种很好的方法,可以在任何一种平台上使用。

而是使用您可以使用的javax.xml库

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

    return sb.toString();
}

请记住,
java.xml.bind
等在Android上不可用,但还有其他方法可以转换为十六进制(
biginger
String.format()
等)。
static String byteToHex(byte[] keyBytes) 
{
    StringBuilder sb = new StringBuilder();
    for (byte b : keyBytes) {
        sb.append(String.format("%1$02X", b));
    }

    return sb.toString();
}