JavaCard 中的 BigInteger 减法

BigInteger subtraction in JavaCard

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

现在,细节使任务变得棘手。我可以使用一张智能卡。 model为飞天JavaCOS A22,运行Java卡2.2。有关详细信息,Java Card 允许使用 非常 Java API 的受限子集( 即,没有 int,没有char,当然也没有BigInteger),但确实支持可以在此 list.

上详细说明的一系列密码原语

特别是,我的任务是在卡上实现经典的 ElGamal。到目前为止,我找到了两个相关回复。在第一个 one, Maarten points out that ElGamal is not on the standard, and therefore the functionality would need to be implemented. In this answer 中,thotheolh 与 Java Card 2.2 中 DiffieHellman 的 实现共享一个 link 基于相同的原则:因为它不是原生支持,它利用了 RSA 的功能。

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

好吧,实际上没有原生 real BigInteger 对 JavaCard 的支持。有 BigNumber,但我认为它不符合您的要求。

不过,有一种方法可以承担这个限制。

有一些 JavaCard 库应该 允许您处理任意长的大整数 - 问题是您的小程序可能 运行 内存不足。 库的来源是 here, and here 是预构建的 .jar

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

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


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


希望对您有所帮助。

UPD

BigNumber 保证 至少 8 个字节,但据我所试,它允许 恰好 8 个字节,这对于保存一些安全可靠的参数来说太小了。比如说,它不包含等于 57896044618658097711785492504343953926634992332820282019728792003956564821041.

的安全质数 p

你可以自己用方法getMaxBytesSupported()试一下,以确保事实。

因此,如您所见,BigNumber 对于 JavaCard 来说相对较大,但仍然比大多数加密协议需要的要小。

正如其他人所说,即使在今天,您也不会在大多数 JavaCards 中找到原生 IntegersBigInts

然而,对于 4 年后仍然想知道的人来说,JCMathLib 实际上实现了 this functionality

它不像本机实现那样快,但它使用加密协处理器(如果可能)并实现不错的性能。