Module java.base
Package javax.crypto

Class KEM

java.lang.Object
javax.crypto.KEM

public final class KEM extends Object
该类提供了密钥封装机制(KEM)的功能。KEM可用于使用两个参与方之间的非对称或公钥加密来保护对称密钥。发送方调用encapsulate方法生成一个秘密密钥和一个密钥封装消息,接收方调用decapsulate方法从密钥封装消息中恢复相同的秘密密钥。

getInstance方法创建一个实现指定算法的新KEM对象。

KEM对象是不可变的。可以同时在同一个KEM对象上安全地调用多个newEncapsulator和newDecapsulator方法。

如果在实例化KEM对象时未在getInstance方法中指定提供程序,则newEncapsulator和newDecapsulator方法可能会返回来自不同提供程序的封装器或解封装器。所选的提供程序基于传递给newEncapsulator或newDecapsulator方法的参数:私钥或公钥以及可选的AlgorithmParameterSpec。KEM.Encapsulator.providerName()和KEM.Decapsulator.providerName()方法返回所选提供程序的名称。

Encapsulator和Decapsulator对象也是不可变的。可以同时在同一个Encapsulator或Decapsulator对象上调用多个encapsulate和decapsulate方法。每次调用encapsulate都会生成一个新的共享秘密和密钥封装消息。

示例:

   // 接收方
   var kpg = KeyPairGenerator.getInstance("X25519");
   var kp = kpg.generateKeyPair();

   // 发送方
   var kem1 = KEM.getInstance("DHKEM");
   var sender = kem1.newEncapsulator(kp.getPublic());
   var encapsulated = sender.encapsulate();
   var k1 = encapsulated.key();

   // 接收方
   var kem2 = KEM.getInstance("DHKEM");
   var receiver = kem2.newDecapsulator(kp.getPrivate());
   var k2 = receiver.decapsulate(encapsulated.encapsulation());

   assert Arrays.equals(k1.getEncoded(), k2.getEncoded());
自:
21
  • Method Details

    • getInstance

      public static KEM getInstance(String algorithm) throws NoSuchAlgorithmException
      返回一个实现指定算法的KEM对象。
      参数:
      algorithm - KEM算法的名称。有关标准KEM算法名称的信息,请参阅Java安全标准算法名称规范中的KEM部分。
      返回:
      新的KEM对象
      抛出:
      NoSuchAlgorithmException - 如果没有Provider支持指定算法的KEM实现
      NullPointerException - 如果algorithm为null
    • getInstance

      public static KEM getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException
      从指定的安全提供程序返回一个实现指定算法的KEM对象。
      参数:
      algorithm - KEM算法的名称。有关标准KEM算法名称的信息,请参阅Java安全标准算法名称规范中的KEM部分。
      provider - 提供程序。如果为null,则此方法等效于getInstance(String)。
      返回:
      新的KEM对象
      抛出:
      NoSuchAlgorithmException - 如果指定了提供程序但它不支持指定的KEM算法,或者如果provider为null且没有提供者支持指定算法的KEM实现
      NullPointerException - 如果algorithm为null
    • getInstance

      public static KEM getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException
      从指定的安全提供程序返回一个实现指定算法的KEM对象。
      参数:
      algorithm - KEM算法的名称。有关标准KEM算法名称的信息,请参阅Java安全标准算法名称规范中的KEM部分。
      provider - 提供程序。如果为null,则此方法等效于getInstance(String)。
      返回:
      新的KEM对象
      抛出:
      NoSuchAlgorithmException - 如果指定了提供程序但它不支持指定的KEM算法,或者如果provider为null且没有提供者支持指定算法的KEM实现
      NoSuchProviderException - 如果指定的提供程序未在安全提供程序列表中注册
      NullPointerException - 如果algorithm为null
    • newEncapsulator

      public KEM.Encapsulator newEncapsulator(PublicKey publicKey) throws InvalidKeyException
      在KEM发送方创建一个KEM封装器。

      此方法等效于newEncapsulator(publicKey, null, null)。

      参数:
      publicKey - 接收方的公钥,不得为null
      返回:
      此密钥的封装器
      抛出:
      InvalidKeyException - 如果publicKey为null或无效
      UnsupportedOperationException - 如果不支持此方法,因为必须提供AlgorithmParameterSpec
    • newEncapsulator

      public KEM.Encapsulator newEncapsulator(PublicKey publicKey, SecureRandom secureRandom) throws InvalidKeyException
      在KEM发送方创建一个KEM封装器。

      此方法等效于newEncapsulator(publicKey, null, secureRandom)。

      参数:
      publicKey - 接收方的公钥,不得为null
      secureRandom - 用于封装的随机源。如果为null,则将使用实现中的默认源。
      返回:
      此密钥的封装器
      抛出:
      InvalidKeyException - 如果publicKey为null或无效
      UnsupportedOperationException - 如果不支持此方法,因为必须提供AlgorithmParameterSpec
    • newEncapsulator

      在KEM发送方创建一个KEM封装器。

      算法可以定义一个AlgorithmParameterSpec子类,在此方法中提供额外信息。如果相同的密钥可以以不同方式派生共享秘密,这将特别有用。如果需要传输此对象内的任何额外信息以便接收方能够创建匹配的解封装器,它将作为字节数组包含在封装输出的KEM.Encapsulated.params字段中。在这种情况下,安全提供程序应使用与KEM相同的算法名称提供AlgorithmParameters实现。接收方可以使用接收到的params字节数组启动这样的AlgorithmParameters实例,并恢复要在其newDecapsulator(PrivateKey, AlgorithmParameterSpec)调用中使用的AlgorithmParameterSpec对象。

      参数:
      publicKey - 接收者的公钥,不得为null
      spec - 可选参数,可以为null
      secureRandom - 封装的随机源。如果为null,则将使用实现中的默认随机源。
      返回:
      此密钥的封装器
      抛出:
      InvalidAlgorithmParameterException - 如果spec无效或需要一个但specnull
      InvalidKeyException - 如果publicKeynull或无效
    • newDecapsulator

      public KEM.Decapsulator newDecapsulator(PrivateKey privateKey) throws InvalidKeyException
      在KEM接收方创建一个KEM解封装器。

      此方法等效于newDecapsulator(privateKey, null)

      参数:
      privateKey - 接收者的私钥,不得为null
      返回:
      此密钥的解封装器
      抛出:
      InvalidKeyException - 如果privateKeynull或无效
      UnsupportedOperationException - 如果不支持此方法,因为必须提供AlgorithmParameterSpec
    • newDecapsulator

      在KEM接收方创建一个KEM解封装器。
      参数:
      privateKey - 接收者的私钥,不得为null
      spec - 参数,可以为null
      返回:
      此密钥的解封装器
      抛出:
      InvalidAlgorithmParameterException - 如果spec无效或需要一个但specnull
      InvalidKeyException - 如果privateKeynull或无效
    • getAlgorithm

      public String getAlgorithm()
      返回此KEM对象的算法名称。
      返回:
      KEM对象的算法名称。