【发布时间】: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