gpt4 book ai didi

cryptography - 如何转换 Java Card 的 ECDSA 曲线参数

转载 作者:行者123 更新时间:2023-12-03 09:12:17 25 4
gpt4 key购买 nike

如何转换这些 192-ECDSA 曲线参数以在 Java Card 中使用?

p = 6277101735386680763835789423207666416083908700390324961279 
n = 6277101735386680763835789423176059013767194773182842284081
SEED = 3045ae6f c8422f64 ed579528 d38120ea e12196d5
c = 3099d2bb bfcb2538 542dcd5f b078b6ef 5f3d6fe2 c745de65
b = 64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1
Gx = 188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012
Gy = 07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811

最佳答案

您必须将值映射到 Java Card 参数,这比看起来更困难,因为缺乏命名约定。此外,您的某些参数是十进制的,但对于 Java Card,您需要它们是十六进制的。

让我们逐步解决您想要使用参数初始化的 Java 卡 ECKey 的问题:

场素数 p

对应按键的key.setFieldFP。您的值是十进制,但您需要它是十六进制:

private final static byte[] fp = new byte[] { 
(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)0xFE, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF
};

订单n

对应 key 的key.setR。您的值是十进制,但您需要它是十六进制:

private final static byte[] r = new byte[] {
(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)0x99, (byte)0xDE, (byte)0xF8, (byte)0x36, (byte)0x14, (byte)0x6B, (byte)0xC9, (byte)0xB1, (byte)0xB4, (byte)0xD2, (byte)0x28, (byte)0x31
};

系数a

设置为-3(模p)以使prime192v1的计算有效。这只是您需要知道的事实。十六进制表示为:

private final static byte[] a = new byte[] {
(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)0xFE, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFC
};

系数b

很简单,因为它是Java Card中的key.setB。您将其作为十六进制字符串 = 无需转换:

private final static byte[] b = new byte[] {
(byte)0x64, (byte)0x21, (byte)0x05, (byte)0x19, (byte)0xE5, (byte)0x9C, (byte)0x80, (byte)0xE7, (byte)0x0F, (byte)0xA7, (byte)0xE9, (byte)0xAB, (byte)0x72, (byte)0x24, (byte)0x30, (byte)0x49, (byte)0xFE, (byte)0xB8, (byte)0xDE, (byte)0xEC, (byte)0xC1, (byte)0x46, (byte)0xB9, (byte)0xB1
};

发电机点G

很棘手,因为您必须连接两个坐标,将它们转换为未压缩形式并在前面添加前缀04(未压缩形式的指示符)。有些卡支持其他格式,但不能保证,所以使用 uncompressed form. 是更明智的选择。您的坐标已经是十六进制 = 无需转换:

private final static byte[] g = new byte[] {
(byte)0x04, (byte)0x18, (byte)0x8D, (byte)0xA8, (byte)0x0E, (byte)0xB0, (byte)0x30, (byte)0x90, (byte)0xF6, (byte)0x7C, (byte)0xBF, (byte)0x20, (byte)0xEB, (byte)0x43, (byte)0xA1, (byte)0x88, (byte)0x00, (byte)0xF4, (byte)0xFF, (byte)0x0A, (byte)0xFD, (byte)0x82, (byte)0xFF, (byte)0x10, (byte)0x12, (byte)0x07, (byte)0x19, (byte)0x2B, (byte)0x95, (byte)0xFF, (byte)0xC8, (byte)0xDA, (byte)0x78, (byte)0x63, (byte)0x10, (byte)0x11, (byte)0xED, (byte)0x6B, (byte)0x24, (byte)0xCD, (byte)0xD5, (byte)0x73, (byte)0xF9, (byte)0x77, (byte)0xA1, (byte)0x1E, (byte)0x79, (byte)0x48, (byte)0x11
};

辅因子 h

对应 key 的key.setK。通常省略该参数,使用默认值1

按键初始化:

如果您如上所述将参数声明为私有(private)静态最终字节数组,则可以通过以下方式初始化您的ECkey:

key.setFieldFP(fp, (short)0, (short)fp.length);
key.setR(r, (short)0, (short)r.length);
key.setA(a, (short)0, (short)a.length);
key.setB(b, (short)0, (short)b.length);
key.setG(g, (short)0, (short)g.length);

您可能想知道 SEEDc 值是什么以及它们的含义,因为我根本没有使用它们来计算 Java Card 参数。

SEED是一个随机值,用于生成其他参数。 SHA-1 哈希值是根据 SEED 计算得出的。这就是您符号中的 c 。值 ab 源自 c

这是整个 EC 密码学中最有问题的一点:NIST 选择种子是真正随机的吗? We don't know 。他们可能选择它是为了在解密或签名伪造方面获得一些优势,因为所得的曲线在某种程度上可能是“简单的”。

关于cryptography - 如何转换 Java Card 的 ECDSA 曲线参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41098742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com