我已通过以下代码创建了加密密钥:
SecretKeyFactory skFactory = SecretKeyFactory.getInstance("PBEWithSHA1AndDESede");
SecretKey key = skFactory.generateSecret(new PBEKeySpec("<some password>".toCharArray()));
然后我用密钥加密了一些文本。
我已将此密钥存储在Java密钥库中并保存在FS:
中KeyStore ks = KeyStore.getInstance("JCEKS");
ks.setKeyEntry(keyAlias, key ,keyPassword.toCharArray(), null);
FileOutputStream fileOutputStream = new FileOutputStream (keyStorePath);
keyStore.store(fileOutputStream , keyStorePassword.toCharArray());
fileOutputStream.close();
在另一个过程中,我打开密钥库并尝试解密一些文本:
KeyStore ks2 = KeyStore.getInstance("JCEKS");
ks2.load(new java.io.FileInputStream(keyStorePath), ksPassword.toCharArray());
SecretKeyFactory skFactory2 = SecretKeyFactory.getInstance("PBEWithSHA1AndDESede");
String passForTheKey = ks2.getKey(keyAlias, keyPass.toCharArray()).toString();
KeySpec key = new PBEKeySpec(passForTheKey.toCharArray());
SecretKey sKey2 = skFactory.generateSecret(key);
尝试解密文本时,我收到错误:
java.security.InvalidKeyException: Given final block not properly padded
如果我在创建密钥后立即尝试使用密钥而不将其存储在密钥存储区中,则说明代理工作正常。
有什么想法吗?
答案 0 :(得分:0)
您将实际的密钥存储在密钥库中(这是正常的)。但是,您似乎正在尝试将其作为密码读取,以用于稍后生成的新密钥。
而不是:
String passForTheKey = ks2.getKey(keyAlias, keyPass.toCharArray()).toString();
KeySpec key = new PBEKeySpec(passForTheKey.toCharArray());
SecretKey sKey2 = skFactory.generateSecret(key);
使用它:
SecretKey sKey2 = (SecretKey) ks2.getKey(keyAlias, keyPassword.toCharArray());
您从密钥库中读取的内容是密钥本身(因为您已存储密钥),而不是密码。 (generateSecret
只会生成一个新密钥。)