Java 给定一个密钥对,如何验证此密钥对中包含的密钥是否为预期长度?

Java 给定一个密钥对,如何验证此密钥对中包含的密钥是否为预期长度?,java,security,cryptography,jca,key-pair,Java,Security,Cryptography,Jca,Key Pair,我正在编写一些Junit测试,其中生成了许多java.security.KeyPair类型的对象(来自java.security.KeyPairGenerator) 我添加了一些断言,以确认这些密钥对中包含的密钥具有预期属性(预期算法和预期大小) 例如,我添加了一条assert语句,以确认算法是预期的算法,使用: String expectedAlgorithm = "RSA"; String errorMsg = "The key is not of the expected algorith

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

我添加了一些断言,以确认这些密钥对中包含的密钥具有预期属性(预期算法和预期大小)

例如,我添加了一条assert语句,以确认算法是预期的算法,使用:

String expectedAlgorithm = "RSA";
String errorMsg = "The key is not of the expected algorithm";
assertEquals(errorMsg, expectedAlgorithm, privateKey.getAlgorithm());
我试图在密钥对或密钥本身中找到返回密钥大小(位数)的方法,但我找不到这样的方法

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

String stringRepresentation = publicKey.toString();
我发现对于SunRsaSign提供程序,该字符串包含其第一行中的位数(因此可以通过分析该字符串来确认密钥大小)。但是,当我检查Bouncy Castle的相同方法时,我发现该字符串不包含位数。如下所示:

RsaSunSign提供程序对密钥的toString()输出:

Sun RSA public key, 1024 bits
  modulus: 10827493886854...
  public exponent: 65537
RSA Public Key
            modulus: 830d0eb805c527e8...
    public exponent: 10001
从Bouncy Castle提供程序对密钥输出toString():

Sun RSA public key, 1024 bits
  modulus: 10827493886854...
  public exponent: 65537
RSA Public Key
            modulus: 830d0eb805c527e8...
    public exponent: 10001
因此,使用键的字符串表示的输出来确认其大小显然是不安全的,因为我们不知道将使用哪个提供程序


因此,我的问题是:给定一个密钥对(以及用于生成该密钥对的KeyPairGenerator),是否有一种与提供者无关的方法来确认密钥对中密钥的大小?

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

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

int keysize = RSAPublicKey.getModulus().bitLength();
您可能必须(向下)将
PublicKey
PrivateKey
转换为
RSAPublicKey
RSAPrivate
密钥,然后才能访问模块

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