2

我正在尝试在 Java Card 2.2.1 版上实现 RSA 签名。我已经实现了 RSA 2048 并成功测试了它,但是当尝试使用MessageDigest该类进行散列时,我无法得到正确的答案作为响应。

这是我的代码:

MessageDigest md = MessageDigest.getInstance(MessageDigest.ALG_SHA, false);
md.reset();
md.doFinal(toSign, bOffset, bLength, tempBuffer, (short) 0);`

但我没有得到正确的答案;不为ALG_SHA也不为ALG_MD5

我想知道问题是什么。我见过的所有样本都使用相同的方法和参数。

4

1 回答 1

4

Java Card 2.2.1 规范不支持 SHA-256(或任何其他 SHA-2 消息摘要)。它只支持 SHA1 和 MD5,两个完全不同的加密哈希函数。因此,MessageDigest.ALG_SHAMessageDigest.ALG_MD5不会得到一个MessageDigest可以计算 SHA-256 哈希函数的实例。

只有 Java Card 2.2.2 及更高版本支持各种 SHA2 函数。在该规范中,MessageDigest该类还将支持

  • SHA-256: MessageDigest.ALG_SHA_256,
  • SHA-384:MessageDigest.ALG_SHA_384
  • SHA-512 MessageDigest.ALG_SHA_512:。

因此,如果您很幸运并且您的卡实际上支持 Java Card 2.2.2,那么您实际上可以使用这些常量来获得一个合适的MessageDigest对象。

如果你的卡不支持 Java Card 2.2.2,那么,当然,你不能使用 不应该1能够使用的那些常量。你仍然可以查看你的卡的手册,如果它支持一些MessageDigest也支持 SHA-256 的专有实现,尽管我非常怀疑这一点。



1 ) 感谢vlp指出实际上有一些卡是 Java Card 2.2.1(或更低版本),它们似乎支持使用 Java Card 2.2.2 API 中引入的 SHA-2 算法常量。这可能只是由其他实现错误引起的,似乎没有人测试过这些算法是否真的适用于这些卡。有关这方面的发现,请参阅JCALgTest 列表

于 2017-02-28T18:39:32.603 回答