【问题标题】:Restricted elliptic curves in Java CardJava Card中的受限椭圆曲线
【发布时间】:2015-07-02 12:52:28
【问题描述】:

我正在尝试在 Java Card 中实现椭圆曲线上的加密算法。

首先,我在 256 位椭圆曲线(NIST 椭圆曲线)上实现了它,效果很好。

现在我想在 512 位曲线上测试它(而不是像 NIST 那样的 521 曲线)。我的卡支持这种大小,我找到了一个这种大小的椭圆曲线数据库(为密码学定义良好)。 但是我遇到了一个奇怪的问题...

当我尝试初始化我的密钥时:

ECPublicKey pubKey = (ECPublicKey) KeyBuilder.buildKey(
            KeyBuilder.TYPE_EC_FP_PUBLIC, (short) 0x0200, false);

pubKey.setFieldFP(new byte[] { (byte) 0x25, (byte) 0x37,
            (byte) 0xD2, (byte) 0x9C, (byte) 0x8B, (byte) 0xFE,
            (byte) 0x7D, (byte) 0x9F, (byte) 0x48, (byte) 0x98,
            (byte) 0xF7, (byte) 0x60, (byte) 0xF8, (byte) 0x7D,
            (byte) 0xBF, (byte) 0x63, (byte) 0x90, (byte) 0x6E,
            (byte) 0x28, (byte) 0x99, (byte) 0x0A, (byte) 0x27,
            (byte) 0x0C, (byte) 0xA6, (byte) 0x15, (byte) 0xD9,
            (byte) 0x1D, (byte) 0xC4, (byte) 0x89, (byte) 0xA8,
            (byte) 0xD0, (byte) 0xA1, (byte) 0xA0, (byte) 0xE7,
            (byte) 0x52, (byte) 0x43, (byte) 0xB0, (byte) 0x39,
            (byte) 0x01, (byte) 0x6A, (byte) 0x61, (byte) 0x43,
            (byte) 0x5C, (byte) 0xA5, (byte) 0x91, (byte) 0xE9,
            (byte) 0x4B, (byte) 0x1A, (byte) 0xF7, (byte) 0x60,
            (byte) 0xC9, (byte) 0xAE, (byte) 0xE2, (byte) 0xCE,
            (byte) 0xE0, (byte) 0x15, (byte) 0x53, (byte) 0x51,
            (byte) 0x1C, (byte) 0x93, (byte) 0x0E, (byte) 0xF3,
            (byte) 0xBA, (byte) 0x0B }, (short) 0x0000, (short) 0x0040);

函数setFieldFP 引发CryptoException,原因码为ILLEGAL_VALUE,这意味着密钥长度不匹配......但它确实匹配(0x0200 是曲线的大小,以位为单位,@ 987654326@ 是素数的长度(以字节为单位)!

我说这真的很奇怪,因为如果我尝试使用以下值:

ECPublicKey pubKey = (ECPublicKey) KeyBuilder.buildKey(
            KeyBuilder.TYPE_EC_FP_PUBLIC, (short) 0x0200, false);

pubKey.setFieldFP(new byte[] { (byte) 0xFF, (byte) 0xFF,
            (byte) 0xFF, (byte) 0xFF, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0xFF, (byte) 0xFF,
            (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
            (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
            (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
            (byte) 0xFF, (byte) 0xFF, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
            (byte) 0x00, (byte) 0x00, (byte) 0xFF, (byte) 0xFF,
            (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
            (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
            (byte) 0xFF, (byte) 0xFF}, (short) 0x0000, (short) 0x0040);

效果很好……

所以我必须得出结论,提出的CryptoException 并不真正关心参数的大小,因为在这两种情况下,大小是相同的......

那又怎样?我的卡是否只支持特定字段的椭圆曲线?有人遇到过这种问题吗?

【问题讨论】:

  • 你在哪里找到你的价值观?
  • 我要使用的值来自项目Arcana-ECDB(密码学椭圆曲线的免费数据库)。我用Java测试了一些东西,它工作正常。第二个没有引发CryptoException 的只是我在 NIST 的 P-256 曲线中定义的素数 p,我写了两次以获得一个 64 字节数组...
  • 你确定你的值是大端和右对齐的吗?
  • 是的,十进制是p=1949267833991132156624567702038114900258750954300540297313343803851286200632152793789301494716697433175386117075231418405857650629212030482306845113563659,十六进制是25 37 D2 9C 8B FE 7D 9F 48 98 F7 60 F8 7D BF 63 90 6E 28 99 0A 27 0C A6 15 D9 1D C4 89 A8 D0 A1 A0 E7 52 43 B0 39 01 6A 61 43 5C A5 91 E9 4B 1A F7 60 C9 AE E2 CE E0 15 53 51 1C 93 0E F3 BA 0B
  • 什么卡?注意初始化后supported和supported有区别。芯片支持 512 位 ECC 并不意味着平台支持。

标签: java cryptography javacard elliptic-curve


【解决方案1】:

你的素数不够大。对于 512 位的 F(p) 曲线,您应该使用 512 位素数。但是,您的第一个字节 (byte) 0x25 以十六进制数字 2 开头。这意味着第一个字节首先以设置为 0 的 2 个二进制数字开头,这意味着您定义了一个 512 - 2 = 510 位素数。

请仅使用定义明确的曲线,例如 NIST P521 曲线或 BrainpoolP512r1 曲线。

【讨论】:

  • 哇!难以调试的错误!所以我们必须考虑第一个字节的高半字节必须大于8
  • 嗯,是的,除非卡也支持 510 位曲线。但我想知道素数是如何生成的(我检查了它一个素数)。
  • 我想知道您为什么对质数生成感到疑惑吗?在现在 Java Cards 上生成一个512 位素数很难吗?(例如,由于卡的资源限制)。无论如何,根据第一个提问者在他的帖子下的评论,我认为质数是卡外生成的。
  • 嗯,不,生成 512 位素数的难度是生成 1024 位密钥对的一半。不难,但需要时间。然而,不应在受控环境之外尝试生成域参数(包括素数),当然也不应在智能卡上尝试。似乎素数代 - 例如 - 仅限于 [1.. 2^512) 而不是 [2^511 ... 2^512)
  • 哇,确实很难调试,非常感谢!如果您想了解更多有关这些椭圆曲线的构造的信息,可以在网站AcryptA 上下载项目Arcana-ECDB。它包含一篇论文,解释了他们如何继续构建此数据库:acrypta.com/telechargements/ell_tech_report_public.pdf 再次感谢您 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多