java - 给定一个 key 对,我如何验证该 key 对中包含的 key 是否符合预期长度?

标签 java security cryptography jca key-pair

我正在编写一些 Junit 测试,其中生成了许多 java.security.KeyPair 类型的对象(来自 java.security.KeyPairGenerator)

我添加一些断言来确认这些 key 对中包含的 key 具有预期的属性(预期的算法和预期的大小)。

例如,我添加了一个断言语句来确认该算法是预期的算法,使用:

String expectedAlgorithm = "RSA";
String errorMsg = "The key is not of the expected algorithm";
assertEquals(errorMsg, expectedAlgorithm, privateKey.getAlgorithm());

我试图在 KeyPair 或 Key 本身中找到一些返回键的大小(位数)的方法,但我找不到这样的方法。

我检查了键的 toString() 方法的输出,以查看该字符串是否包含键的大小,使用:

String stringRepresentation = publicKey.toString();

我发现对于 SunRsaSign 提供程序,该字符串在其第一行中包含位数(因此可以通过解析该字符串来确认 key 大小。但是当我检查 Bouncy CaSTLe 的相同方法时,我发现字符串不包含位数,如下图:

来自 RsaSunSign 提供程序的 key 上的 toString() 输出:

Sun RSA public key, 1024 bits
  modulus: 10827493886854...
  public exponent: 65537

来自 Bouncy CaSTLe Provider 的键上的 toString() 输出:

RSA Public Key
            modulus: 830d0eb805c527e8...
    public exponent: 10001

因此,使用 key 的字符串表示形式的输出来确认其大小显然是不安全的,因为我们无法知道将使用哪个提供程序。

所以我的问题是:给定一个 KeyPair(以及给定用于生成该 KeyPair 的 KeyPairGenerator),是否有一种与提供商无关的方法来确认 KeyPair 中 key 的大小?

最佳答案

RSA key 的大小定义为模数中的位数。请注意,模数的生成方式介于 2 ^ (n - 1) 和 2 ^ n - 1(含)之间,因此它不能小于 key 大小。

因此,要获取公钥或私钥 RSA key 的 key 大小,请执行以下操作:

int keysize = RSAPublicKey.getModulus().bitLength();

您可能需要先将您的 PublicKeyPrivateKey 转换为 RSAPublicKeyRSAPrivate key ,然后才能使用可以访问模数。

通常位大小在字节边界上,即位大小可以除以 8。

关于java - 给定一个 key 对,我如何验证该 key 对中包含的 key 是否符合预期长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23105531/

相关文章:

java - java 8中从父类(super class)继承方法而不是从实现接口(interface)继承默认方法的意义

java - 在 Java 中调用 ArrayList.get() 时出现 NullPointerException?

java - 如何在 Eclipse IDE 中使用 Java SDK 从 Salesforce 提取数据?

windows - 如何防止使用 LsaRetrievePrivateData 从远程机器的任何人轻松读取使用 LsaStorePrivateData 存储的数据?

java - RSA,如何向后通信

c# - HMACSHA256 和 HMACSHA512 之间的区别

java - PowerMockito spy 不会阻止调用抽象方法

algorithm - 在哈希中包含时间戳,但如何比较哈希?

c - 保护内存中的凭据

测试密码学中已实现的算法