2011-06-16 181 views
0

里面的关键当我创建通过下面的代码的加密密钥失败。解密存储Java密钥存储

我已经存储在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 

如果我尝试使用键,但不将其存储在T他在创建它之后立即关键存储,其刻录过程效果很好。

任何想法?

回答

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只会生成一个新的密钥。)

+0

哦!我没有看到......谢谢! – 2011-06-16 13:55:48