2

我正在尝试在非常有限的技术条件下进行概念验证。我的问题是:如何有效地减去 Java Card 中的大整数(表示为字节数组)?.

现在,细节使这项任务变得棘手。我可以使用一张智能卡。机型为飞天JavaCOS A22,运行Java Card 2.2。对于完整的细节,Java Card 允许使用非常受限的 Java API 子集(即,没有int、没有char,当然也没有BigInteger),但它确实支持一系列可以在此列表中详述的加密原语.

特别是,我的任务是在卡片上实现经典的 ElGamal。到目前为止,我找到了两个相关的回复。在第一个中,Maarten 指出 ElGamal 不符合标准,因此需要实现该功能。在这个答案中,thotheolh基于相同的原则共享了指向Java Card 2.2 中 DiffieHellman 实现的链接:由于它不受本机支持,因此它利用了 RSA 的功能。

逻辑是无缝的:RSA、ElGamal 和 DiffieHellman 依赖于相同的基本操作 $a^b mod c$。基于 thotheolh 的代码,我已经成功实现了密钥生成。加密发生在卡外,所以这不是我关心的问题。但解密需要特定的变体。对于解密 $b=p-1-x$,其中 $p$ 和 $x$ 都是 BigIntegers。这就是我卡住的地方:如何有效地计算 $p-1-x$?

4

2 回答 2

1

好吧,事实上,JavaCard 并没有像本机真正的 BigInteger支持这样的东西。有BigNumber,但我认为它不符合您的要求。

但是,有一种方法可以实现此限制。

有一些 JavaCard 库应该允许您处理任意长的大整数 - 问题是您的小程序可能会耗尽内存。库的来源在这里这里是预建的.jar

这种方法可能有效,但在真实卡上也可能非常缓慢。但是,如果您在模拟器中仅针对 PoC 运行此类代码,这不是问题。

我不知道你的 IDE 是什么,但这就是你如何为 IntelliJ 添加这个库的方法。


但是,正如 Maarten Bodewes 指出的那样,您可能最好关注字节减法,因为任何BigIntegerJavaCard 库都可能效率低下。


希望这可以帮助。

UPD

BigNumber保证至少有8 个字节,但就我而言,它只允许8个字节,这对于保存一些安全性强的参数来说太小了。比如说,它不包含p等于 57896044618658097711785492504343953926634992332820282019728792003956564821041 的安全素数。

您可以自己尝试使用方法getMaxBytesSupported()来确保事实。

因此,如您所见,BigNumberJavaCard 相对较大,但仍比大多数加密协议所需的要小。

于 2016-03-27T13:00:08.187 回答
0

正如其他人所说,即使在今天,您也不会在本机IntegersBigInts大多数 JavaCard 中找到。

然而,对于 4 年后仍然想知道的人来说,JCMathLib 实际上实现了这个功能

它没有本地实现那么快,但它使用加密协处理器(在可能的情况下)并实现了不错的性能。

于 2020-09-16T09:12:26.427 回答