JavaCard:RSAPrivateKey.setModulus 抛出 CryptoException.ILLEGAL_VALUE

问题描述 投票:0回答:1

我正在开发一个 JavaCard 小程序,现在我必须计算模指数运算。为此,我一直使用自我修改版本的JCMathLib,它最终使用RSAPrivateKey来处理操作,特别是在文件BigNat.java.中。但是,当我在卡上运行此命令时,第 291 行 抛出一个 CryptoException,原因代码为 ILLEGAL_VALUE。

JavaCard上RSAPrivateKey.setModulus的文档说,该方法会抛出一个CryptoException,如下所示“如果输入模数数据长度与实现不一致或者需要输入数据解密并失败”。我不确定,但我认为在这种情况下不需要输入数据解密,因此我假设模数数据长度“与实现不一致”。但是,我不确定什么与实现一致。有谁知道什么决定了正确的模数输入长度,以及该长度是以位还是字节为单位测量的?

作为参考,我想要使用的模数的原始形式是 32 字节长。该代码将其填充为 64 字节 (rm.MAX_EXP_LENGTH),并在其作为输入传递给 setModulus 调用之前用零(前置)进行填充。相同的长度作为长度参数给出。当使用 KeyBuilder 构建相关 RSAPrivateKey 对象时,它的长度为 512 位,相当于 64 字节。

我还尝试传递 512 作为长度参数,以防长度以位为单位测量,但这会导致 IndexOutOfBoundsException,这表明它确实需要字节。不过我还是想问一下以确定。

提前谢谢您!

java cryptography rsa javacard
1个回答
0
投票

RSA 模数定义RSA 的密钥大小。因此,如果您有 512 位私钥和 64 字节,那么第一个/最左边的字节需要设置为

0x80
或更高,以指示 2^511 或更高,因为这些密钥实际上在 2^511 和 2^512 之间- 位索引毕竟是从零开始的。

请注意,RSA 假定无符号、大端整数表示形式。

© www.soinside.com 2019 - 2024. All rights reserved.