1

我正在尝试使用从 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 密钥进行加密时没有抛出异常。

4

2 回答 2

2

如果您使用 HSM 执行加密,则加密过程在 HSM 中执行,而不是在软件中执行。Cipher不实现加密过程本身。根据在调用. CipherSpi_ _ 因此,尽管该函数似乎执行相同的操作,但实际上该功能取决于提供者,在您的情况下,取决于 PKCS#11 包装器、库,当然还有 HSM。Cipherinit()desEncrypt()

现在 PKCS#11 是一个接口规范;并非 PKCS#11 中的所有机制都会在每个令牌中实现。某些加密算法可能太晦涩或太不安全。后者可能是 DES ECB 的情况,因为该算法非常不安全。这并不意味着 DES 密钥不能被普遍使用——它们仍然可以在例如 MAC 计算中发挥作用。因此,如果支持 DES ECB(在当前设置中),请检查您的 HSM 文档。

-Djava.security.debug=sunpkcs11您可以通过添加对 Java 解释器 (javajavaw)的调用来获取有关 PKCS#11 方法调用的更多信息。如果 DES 不起作用,请尝试更安全、更常见的"AES/CBC/PKCS5Padding"或三重 DES 机制。

于 2013-11-03T13:31:33.437 回答
-1

看看这个帖子有没有帮助

密钥不正确(更有可能)或提供者不支持给定的密钥。

KeyStore.getInstance("PKCS11", provider);

PS:您使用的是自定义提供程序吗?

于 2013-11-02T12:46:17.953 回答