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