我正在编写一些 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();
您可能需要先将您的 PublicKey
或 PrivateKey
转换为 RSAPublicKey
和 RSAPrivate
key ,然后才能使用可以访问模数。
通常位大小在字节边界上,即位大小可以除以 8。
关于java - 给定一个 key 对,我如何验证该 key 对中包含的 key 是否符合预期长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23105531/