每次使用相同的密码运行设置方法时,每次都会得到不同的密钥结果。我使用密钥结果来检查解密密码是否正确,以防止不必要的解密。
我在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;
}
答案 0 :(得分:1)
更改行:
SecretKey key = SecretKeyFactory.getInstance(
"PBEWithMD5AndDES").generateSecret(keySpec);
到
SecretKey key = SecretKeyFactory.getInstance(
"PBEWithMD5AndDES","BC").generateSecret(keySpec);
像这样你特意要求加密提供者(充气城堡) 注意:您还必须将bouncycastle提供程序添加到VM中。
答案 1 :(得分:1)
也许我误解了这个问题,但听起来你想要密钥的实际内容 - 密钥的实际值,作为一个字节序列,它将进行加密。
文本org.bouncycastle.jce.provider.JCEPBEKEY@12345678不是密钥的实际值。这只是意味着JCEPBEKEY类没有覆盖默认的toString实现。要将密钥的实际值作为字节数组获取,请使用
byte [] keyBytes = key.getEncoded();
[更新/缩回]
在JVM上,我将使用以下内容将其打印为十六进制字符串:
String keyString = javax.xml.bind.DatatypeConverter.printHexBinary(keyBytes);
但如上所述,这在Android上无法使用。来自@ user1024882的答案看起来像是一种适用于任何平台的精细方法。
答案 2 :(得分:1)
使用javax.xml lib,您可以使用
static String byteToHex(byte[] keyBytes)
{
StringBuilder sb = new StringBuilder();
for (byte b : keyBytes) {
sb.append(String.format("%1$02X", b));
}
return sb.toString();
}