当前位置: 首页 > 知识库问答 >
问题:

没有安装的提供程序支持此密钥:sun.security.rsa.rsapublickeyimpl,也没有这样的算法:aes/gcm/nopadding

姜志行
2023-03-14
      String pubAlgo = publicKeyScanner.nextLine(); // not used
      String PublicKey = publicKeyScanner.nextLine(); // this will stop when it hits a newline and the encoded key may have the newline char value causing the private key to be piecemeal
      byte[] decodedPublicKey = Base64.getDecoder().decode(PublicKey);
      KeyFactory kf = KeyFactory.getInstance("RSA"); // or "EC" or whatever
      PublicKey DecodedPublicKey = kf.generatePublic(new X509EncodedKeySpec(decodedPublicKey));
      publicKeyScanner.close();
      System.out.println(DecodedPublicKey.toString());
    
      KeyGenerator keyGen = KeyGenerator.getInstance("AES");
      keyGen.init(128); // for example
      SecretKey AESKey = keyGen.generateKey();

      KeyPairGenerator kpgen = KeyPairGenerator.getInstance("RSA");
      kpgen.initialize(2048);
      Provider kpgenProv = kpgen.getProvider();
      System.out.println(kpgenProv.getName());
      Cipher cipherAES = Cipher.getInstance("AES/GCM/NoPadding", kpgenProv.getName());
      cipherAES.init(Cipher.ENCRYPT_MODE, DecodedPublicKey);
      byte[] AESKEYBYTES = AESKey.getEncoded();```

共有1个答案

陆涵畅
2023-03-14

Java JDK通常由一些负责加密操作的安全提供程序提供。由于历史原因,它们并没有合并/捆绑,而是彼此相形见绌。如果通过实例化选择一个算法,Java将找出哪个提供者对该算法“负责”并接受他。

另一方面,如果您希望使用特定的提供者,您可以在实例化过程中命名提供者(这就是您使用第二个参数“kpgenProv.getName”所做的:

Cipher.getInstance("AES/GCM/NoPadding", kpgenProv.getName())

正如您在我的简单程序中看到的,“RSA”和“AES/GCM/Nopadding”有两个不同的提供程序,但是当强制使用特定的提供程序时,您会收到一个“no-installed-provider-supports...”例外。

因此,通常省略提供程序名称,让Java为该算法选择“最佳”提供程序。

我的系统(OpenJDK11)上的输出:

Get security provider
provider for RSA encryption: SunRsaSign version 11
provider for AES/GCM/NoPadding: SunJCE version 11

代码:

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;

public class Main {
    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException {
        System.out.println("Get security provider");

        KeyFactory kf = KeyFactory.getInstance("RSA");
        System.out.println("provider for RSA encryption: " + kf.getProvider());

        Cipher cipherAES = Cipher.getInstance("AES/GCM/NoPadding");
        System.out.println("provider for AES/GCM/NoPadding: " + cipherAES.getProvider());
    }
}
 类似资料:
  • 我已经参考了Spring SAML手册来创建私钥和导入公共证书。但是我仍然面临加密/解密的问题。 我用手册中提到的以下命令创建了一个JKS文件,如下所示 用于导入IDP公共证书的命令 用于私钥的命令 私钥和密钥存储库的密码定义为更改 我已经配置了securityContext如下 我可以看到可以选择IDP的idpDiscovery页面。我也可以查看IDP的登录页面。但是当我提供用户凭据时,我得到了

  • 我当前的提供商有: 0-提供程序名称:SUN 1-提供程序名称:SUNRSAGN 2-提供程序名称:SunEC ... 9-提供商名称:SunPKCS11 CartaoCidadao 第九个提供者是我尝试使用的提供者,它使用pkcs11库。 使用info方法我可以看到它正在使用库: SunPKCS11 CartaoCidadao使用library/usr/local/lib/libpteidpkc

  • 我们试图在Java7中实现支持AES/GCM/NOPADDING的加密,以获得以下异常。 找不到任何支持AES/GCM/NOPADDING的提供程序 下面是生成密码实例的代码示例。

  • 我得到了一个错误: 不支持的密码算法(AES-256-GCM)(运行时错误) 但我似乎有所有的要求: $openssl enc-help 2>&1 grep gcm -AES-128-ECB-AES-128-GCM-AES-128-OFB -AES-192-ECB-AES-192-GCM-AES-192-OFB -AES-256-ECB-AES-256-GCM-AES-256-OFB Ruby解释

  • 从angular 4.4升级到5.0,并将所有HttpModule和Http更新到HttpClientModule后,我开始出现此错误。 我还再次添加了HttpModule,以确保这不是由于某些依赖关系造成的,但它并不能解决问题 应用程序内。模块,我已正确设置 我不知道这个错误是从哪里来的,或者我不知道如何去了解它。我也有一个警告(也放在下面),可能是相关的。 警告信息:

  • 我有一个问题加载类到Angular组件。很长一段时间以来,我一直试图解决这个问题;我甚至尝试将它加入到一个文件中。我拥有的是: 一个pplication.ts 服务/名称服务。ts 我一直收到一条错误消息,说。 有人能帮我发现代码的问题吗?