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 プロバイダーの基盤は、への呼び出し中に指定されたキーに応じて遅延プロバイダー選択Cipherを使用して選択されます。したがって、関数は同じ操作を実行するように見えますが、実際には機能はプロバイダーに依存し、あなたの場合は PKCS#11 ラッパー、ライブラリ、そしてもちろん HSM に依存します。init()desEncrypt()

現在、PKCS#11 はインターフェース仕様です。PKCS#11 のすべてのメカニズムがすべてのトークンに実装されるわけではありません。一部の暗号化アルゴリズムは、あいまいすぎるか、安全でない可能性があります。DES ECB のアルゴリズムは非常に安全でないため、後者はおそらく DES ECB の場合です。これは、DES 鍵が一般的に使用できないという意味ではありません。MAC 計算などで役割を果たしている可能性があります。したがって、(現在の設定で) DES ECB がサポートされている場合は、HSM のドキュメントを確認してください。

-Djava.security.debug=sunpkcs11Java インタープリター (javaまたは) への呼び出しに追加することで、PKCS#11 メソッド呼び出しに関する詳細情報を取得できますjavaw。DES が機能しない場合は、より安全で一般的な"AES/CBC/PKCS5Padding"トリプル DES メカニズムを試してください。

于 2013-11-03T13:31:33.437 に答える
-1

この投稿が役立つかどうかを確認してください

キーが正しくない(可能性が高い)か、指定されたキーがプロバイダーによってサポートされていません。

KeyStore.getInstance("PKCS11", provider);

PS: カスタム プロバイダーを使用していますか?

于 2013-11-02T12:46:17.953 に答える