我正在尝试在 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
都较小。
我想知道问题出在哪里。我见过的所有示例都使用相同的方法和参数。
最佳答案
Java Card 2.2.1 规范不支持 SHA-256(或任何其他 SHA-2 消息摘要)。它只支持SHA1和MD5,两种完全不同的加密哈希函数。因此,MessageDigest.ALG_SHA
和 MessageDigest.ALG_MD5
都不会为您提供可以计算 SHA-256 哈希函数的 MessageDigest
实例。
仅 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 list了解相关发现。
关于digital-signature - 如何在Java Card 2.2.1上实现SHA256?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42510621/