【问题标题】:BigInteger subtraction in JavaCardJavaCard中的BigInteger减法
【发布时间】:2016-03-12 19:48:06
【问题描述】:

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

现在,细节使任务变得棘手。我可以使用一张智能卡。模型是飞天JavaCOS A22,运行Java Card 2.2。有关详细信息,Java Card 允许使用 Java API 的非常 受限子集(即,没有 int,没有 char ,当然,没有BigInteger),但它确实支持一系列加密原语,可以在list 中详细说明。

特别是,我的任务是在卡片上实现经典的 ElGamal。到目前为止,我找到了两个相关的回复。在第一个one 中,Maarten 指出 ElGamal 不符合标准,因此需要实现该功能。在这个 answer 中,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$?

【问题讨论】:

  • 我不知道以特殊方式使用 API 的任何方法,但是为什么不能只实现字节减法呢?减法并没有那么慢,你只需要一些代码来处理进位。
  • Petr 的回答可能对将来可能有相同问题的任何人也有用:stackoverflow.com/a/53628582/2724773

标签: cryptography bytearray smartcard javacard elgamal


【解决方案1】:

嗯,事实上没有像原生real BigInteger 这样的东西支持 JavaCard。有BigNumber,但我认为它不符合您的要求。

但是,有一种方法可以解决这个限制。

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

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

我不知道您的 IDE 是什么,但 this 是您可以为 IntelliJ 添加此库的方法。


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


希望这会有所帮助。

UPD

BigNumber 保证为 至少 8 个字节,但据我尝试,它允许 恰好 8 个字节,这对于持有一些安全可靠的参数。比如说,它不包含安全素数 p 等于 57896044618658097711785492504343953926634992332820282019728792003956564821041。

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

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

【讨论】:

  • 为什么说 BigNumber 可能不符合要求?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多