【问题标题】:Java Card Crypto Exception RSA Key EncryptionJava 卡加密异常 RSA 密钥加密
【发布时间】:2015-02-19 17:29:05
【问题描述】:

我正在尝试在 Java Card 上重新创建一个公钥并使用它来加密一些数据。

这是构建我正在使用的公钥的代码:

rsaPublicId = (RSAPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_RSA_PUBLIC, KeyBuilder.LENGTH_RSA_2048, false);
rsaPublicId.setExponent(rsaExponent, (short) 0, (short) rsaExponent.length);
rsaPublicId.setModulus(rsaPublicModulus, (short) 12, (short) ((short) rsaPublicModulus.length - (short) 12));

cipherId.init(rsaPublicId, Cipher.MODE_ENCRYPT);

当我尝试加密数据时,我使用以下代码:

cipherId.doFinal(serviceBytes, (short) 0, (short) 16, buffer, (short) 0);

但它会发生 javacard.security.cryptoException,详细消息为“null”

cipherId = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false);

模数设置为308的大小,用Java创建并发送到卡上。

【问题讨论】:

  • 请用 try-catch 块包围您的异常,并告诉我们在异常实例上调用 getReason() 的结果是什么。
  • 在异常中出现代码 5。它说“/***这个原因码用于表明签名或密码算法没有填充传入消息并且输入消息不是块对齐的。*/ public static final short ILLEGAL_USE = 5;”
  • 什么详细信息? Java Card Classic 中没有详细消息之类的东西。我的意思是:甚至不支持字符串......
  • 可以看到带有debug的消息。

标签: java encryption key javacard


【解决方案1】:

您的模数应该与buildKey 调用期间设置的大小完全相同。因此,如果您的大小是 308(308 什么?),那么您的密钥要么太小(以位为单位)要么太大(如果以字节为单位)。

是否应该允许更小的密钥(最大到某个最小值,308 位太小)是一个讨论主题。然而,在当前规范中,不允许使用比方法调用中给定的键更小的键;键 - 因此模数 - 需要是指定的确切大小。

【讨论】:

  • 您使用的是哪种 Java Card 实现?您会期望更早检测到太大或太小的模数;看来实施不会很快失败。
  • 我正在 Java 应用程序中生成一个 RSA 密钥对,并将公钥的模数发送到 Applet。然后我想重建这个密钥并用它来加密一些数据并将其发回。模数长度为 617 字符串 - 308 字节。我使用的是 2.2 Java Card。
  • 所以创建一个大小为 2464 位的公钥(这是 308 字节密钥的位数)。您不需要保留预定义的常量。如果这不起作用,那么您的 Java Card 应用程序不支持此密钥大小,并且您基本上对那个密钥大小不走运。
  • 错误是我用来重新创建密钥的指数。但是,我更改了代码以在卡内创建密钥并将其发送到 PC。它运作良好。非常感谢!
【解决方案2】:

可能Modulus的长度不等于2048bits,可能会抛出ILLEGAL_USE。

【讨论】:

    【解决方案3】:

    你的算法在这里是错误的

    cipherId = Cipher.getInstance(Cipher.ALG_RSA_PKCS1, false);
    

    请尝试

    cipherId = Cipher.getInstance(Cipher.ALG_RSA_NOPAD, false);
    

    【讨论】:

    • 这是算法的类型,无论哪种方式我都可以使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2010-12-10
    • 2018-09-10
    相关资源
    最近更新 更多