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/

相关文章:

reactjs - react SPA中的魔术链接身份验证

java - 在 JTabbedPane 中拆分标签

java - 将两个逗号分隔的字符串转换为 Map

java - 如何将可观察列表转换为数组列表? java

java - MQ关闭连接的正确方法

node.js - 在 JWT 配置文件中生成并使用 secret

android - 在 Android 应用程序中使用 X509 证书

python - 根据索引将字节对象分成 n 个大小相等的 block

c# - .NET 中的 SHA1CryptoServiceProvider 与 UNIX shasum 不匹配

android - 卸载应用程序时 KeyStore 条目是否丢失?