首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有安装的提供程序支持此密钥: sun.security.pkcs11.P11Key$P11SecretKey在使用SoftHSM2 AES密钥时

没有安装的提供程序支持此密钥: sun.security.pkcs11.P11Key$P11SecretKey在使用SoftHSM2 AES密钥时
EN

Stack Overflow用户
提问于 2019-02-09 16:24:06
回答 1查看 896关注 0票数 1

我愿意使用存储在softHSM2软件中的AES密钥对数据进行加密/解密。

我正在使用以下代码创建我的密钥:

代码语言:javascript
复制
    String configName = "C:\\SoftHSM2\\etc\\pkcs11.cfg";

    cipher = Cipher.getInstance("AES");

    Provider p = new SunPKCS11(configName);
    if (-1 == Security.addProvider(p)) {
        throw new RuntimeException("could not add security provider");
    }

    // Load the key store
    char[] pin = "123456789".toCharArray();
    keyStore = KeyStore.getInstance("PKCS11", p);
    keyStore.load(null, pin);

    SecretKeySpec secretKeySpec = new 
    SecretKeySpec("0123456789ABCDEF".getBytes(), "AES");
    Key key = new SecretKeySpec(secretKeySpec.getEncoded(), "AES");
    keyStore.setKeyEntry("AESKey1", key, "123456789".toCharArray(), null);
    keyStore.store(null);

下面是pkcs11.cfg

代码语言:javascript
复制
name = SoftHSM2
library = c:\SoftHSM2\lib\softhsm2-x64.dll 
slotListIndex = 1

我的Key是正确添加的,输出如下:

代码语言:javascript
复制
AESKey1: SunPKCS11-SoftHSM2 AES secret key, 16 bits (id 4, token object, not sensitive, unextractable)

现在我想使用这个密钥进行加密/解密。下面是要加密的代码:

代码语言:javascript
复制
        myKey = keyStore.getKey("AESKey1", "123456789".toCharArray()); 
        System.out.println("Using key: "+myKey.toString());        
        byte[] plainTextByte = text.getBytes();                 
        cipher.init(Cipher.ENCRYPT_MODE, myKey);
        byte[] encryptedByte = cipher.doFinal(plainTextByte);
        Base64.Encoder encoder = Base64.getEncoder();
        encryptedText = encoder.encodeToString(encryptedByte);

和解密函数:

代码语言:javascript
复制
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] encryptedTextByte = decoder.decode(text);
        cipher.init(Cipher.DECRYPT_MODE, keyStore.getKey("AESKey1", "1234".toCharArray())); 
        byte[] decryptedByte = cipher.doFinal(encryptedTextByte);
        decryptedText = new String(decryptedByte);

但我提出了以下异常:

代码语言:javascript
复制
Using key: SunPKCS11-SoftHSM2 AES secret key, 16 bits (id 10, token object, not sensitive, unextractable)
java.security.InvalidKeyException: No installed provider supports this key: 
sun.security.pkcs11.P11Key$P11SecretKey
    at javax.crypto.Cipher.chooseProvider(Cipher.java:888)
    at javax.crypto.Cipher.init(Cipher.java:1229)
    at javax.crypto.Cipher.init(Cipher.java:1166)

 Encrypted Text After Encryption: 
java.security.InvalidKeyException: No installed provider supports this key: sun.security.pkcs11.P11Key$P11SecretKey
at javax.crypto.Cipher.chooseProvider(Cipher.java:888)
at javax.crypto.Cipher.init(Cipher.java:1229)

两个cipher.init调用都会引发异常,请注意,如果我像这样(在softHSM2之外)创建AES密钥,则此代码可以正常工作:

代码语言:javascript
复制
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128); // block size is 128bits
        SecretKey secretKey = keyGenerator.generateKey();

是不是我错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-01-13 22:07:01

你应该改变

代码语言:javascript
复制
keyStore = KeyStore.getInstance("PKCS11", p);

代码语言:javascript
复制
keyStore = KeyStore.getInstance("PKCS11");

来自意大利的问候

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54604508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档