digital-signature - 如何在Java Card 2.2.1上实现SHA256?

标签 digital-signature smartcard sha256 javacard message-digest

我正在尝试在 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_SHAALG_MD5 都较小。

我想知道问题出在哪里。我见过的所有示例都使用相同的方法和参数。

最佳答案

Java Card 2.2.1 规范不支持 SHA-256(或任何其他 SHA-2 消息摘要)。它只支持SHA1和MD5,两种完全不同的加密哈希函数。因此,MessageDigest.ALG_SHAMessageDigest.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/

相关文章:

c++ - 更改应用程序签名?

ruby - 使用 Ruby OpenSSL 验证非散列数据的签名

c++ - 由于 WINAPI_PARTITION_DESKTOP block ,无法在 UWP 应用程序中使用 winscard.h

perl - 使用 Perl 的数据签名

node.js - Node base64编码带有签名的pdf

java - Java Web 应用程序的智能卡身份验证在哪里完成?

java - SLE4428 智能卡问题

java - 获取 Java 和 C# 之间的匹配校验和

c - 为什么这个 SHA256 函数会打印一些奇怪的字符?

linux - 在 Synology NAS 上安装 sha256sum