我正在尝试使用KeyStore中加载的des键加密,我得到:
Exception in thread "main" java.security.InvalidKeyException: No installed provider supports this key: sun.security.pkcs11.P11Key$P11SecretKey
at javax.crypto.Cipher.chooseProvider(Cipher.java:878)
at javax.crypto.Cipher.init(Cipher.java:1213)
at javax.crypto.Cipher.init(Cipher.java:1153)
这是我的代码:
public static void main(String[] args) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchPaddingException, IOException, CertificateException {
Provider provider = new sun.security.pkcs11.SunPKCS11(DesSaveLoad.class.getClassLoader().getResourceAsStream("pkcs11.cfg"));
Security.removeProvider(provider.getName());
Security.insertProviderAt(provider, 1);
KeyStore keyStore = KeyStore.getInstance("PKCS11", provider);
keyStore.load(null, null);
SecretKey desKey = desGenerateKey();
keyStore.setKeyEntry("t1", desKey, null, null);
SecretKey t1 = (SecretKey) keyStore.getKey("t1", null);
byte[] messageBytes = "message".getBytes();
desEncrypt(messageBytes, 0, messageBytes.length, desKey);
desEncrypt(messageBytes, 0, messageBytes.length, t1); //Exception is thrown here
}
public static SecretKey desGenerateKey() throws NoSuchAlgorithmException {
KeyGenerator keygenerator = null;
keygenerator = KeyGenerator.getInstance("DES");
return keygenerator.generateKey();
}
public static byte[] desEncrypt(byte[] plainText, int offset, int size, SecretKey key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher;
if (size % 8 != 0) {
cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
} else {
cipher = Cipher.getInstance("DES/ECB/NoPadding");
}
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(plainText, offset, size);
}
正如您所看到的,使用生成的des键加密时不会抛出任何异常。
答案 0 :(得分:2)
如果使用HSM执行加密,则加密过程在HSM内执行,而不是在软件中执行。 Cipher
本身不实现加密过程。 CipherSpi
的PKCS#11提供商的基础Cipher
是使用延迟提供商选择选择的,具体取决于调用init()
期间给出的密钥。因此虽然desEncrypt()
函数似乎执行相同的操作,但实际上功能取决于提供程序,在您的情况下,依赖于PKCS#11包装器,库和HSM。
现在PKCS#11是一个接口规范;并非PKCS#11中的所有机制都将在每个令牌中实现。某些加密算法可能过于模糊或太不安全。后者可能就是DES ECB的情况,因为该算法非常不安全。这并不意味着DES密钥一般不能使用 - 它们仍然可以在例如DES中发挥作用。 MAC计算。因此,如果支持DES ECB,请查看HSM的文档(在当前设置中)。
通过在调用Java解释器(-Djava.security.debug=sunpkcs11
或java
)中添加javaw
,可以获得有关PKCS#11方法调用的更多信息。如果DES不起作用,请尝试更安全,更常见的"AES/CBC/PKCS5Padding"
或三重DES机制。
答案 1 :(得分:-1)