难以理解 RFC 6979 中的示例
difficulty understanding the example in RFC 6979
我正在尝试遵循 section A.1.2 of RFC 6979 但遇到了一些困难。
所以h1如下:
h1
AF 2B DB E1 AA 9B 6E C1 E2 AD E1 D6 94 F4 1F C7
1A 83 1D 02 68 E9 89 15 62 11 3D 8A 62 AD D1 BF
如果那是 运行 到 bits2octets(h1)
你应该得到这个:
01 79 5E DF 0D 54 DB 76 0F 15 6D 0D AC 04 C0 32
2B 3A 20 42 24
我不明白。
这里是 Java 中定义的 bits2octets(来自 RFC):
private byte[] bits2octets(byte[] in)
{
BigInteger z1 = bits2int(in);
BigInteger z2 = z1.subtract(q);
return int2octets(z2.signum() < 0 ? z1 : z2);
}
这里是 bits2int:
private BigInteger bits2int(byte[] in)
{
BigInteger v = new BigInteger(1, in);
int vlen = in.length * 8;
if (vlen > qlen) {
v = v.shiftRight(vlen - qlen);
}
return v;
}
这是问题:
q = 0x4000000000000000000020108A2E0CC0D99F8A5EF
h1 是 32 字节长。 q 是 21 个字节长。
因此 bits2int returns h1 的前 21 个字节。即
af2bdbe1aa9b6ec1e2ade1d694f41fc71a831d0268
将其转换为整数,然后减去 q,得到:
af2bdbe1aa9b6ec1e2ade1d694f41fc71a831d0268
- 04000000000000000000020108A2E0CC0D99F8A5EF
------------------------------------------
ab2bdbe1aa9b6ec1e2addfd58c513efb0ce9245c79
结果为正,因此保留 - z2。
然后调用 int2octets()。
private byte[] int2octets(BigInteger v)
{
byte[] out = v.toByteArray();
if (out.length < rolen) {
byte[] out2 = new byte[rolen];
System.arraycopy(out, 0,
out2, rolen - out.length,
out.length);
return out2;
} else if (out.length > rolen) {
byte[] out2 = new byte[rolen];
System.arraycopy(out, out.length - rolen,
out2, 0, rolen);
return out2;
} else {
return out;
}
}
q 和 v 大小相同,所以 ab2bdbe1aa9b6ec1e2addfd58c513efb0ce9245c79
被退回。但这不是测试向量所说的:
bits2octets(h1)
01 79 5E DF 0D 54 DB 76 0F 15 6D 0D AC 04 C0 32
2B 3A 20 42 24
我不明白。我的分析有没有搞砸?
获得的输出为(0xaf2b...d1bf >> (256 - 163)) mod q = 0x0179...4224
。你的错误是假设 bits2int
移动了 bytes 而不是 bits.
我正在尝试遵循 section A.1.2 of RFC 6979 但遇到了一些困难。
所以h1如下:
h1
AF 2B DB E1 AA 9B 6E C1 E2 AD E1 D6 94 F4 1F C7
1A 83 1D 02 68 E9 89 15 62 11 3D 8A 62 AD D1 BF
如果那是 运行 到 bits2octets(h1)
你应该得到这个:
01 79 5E DF 0D 54 DB 76 0F 15 6D 0D AC 04 C0 32
2B 3A 20 42 24
我不明白。
这里是 Java 中定义的 bits2octets(来自 RFC):
private byte[] bits2octets(byte[] in)
{
BigInteger z1 = bits2int(in);
BigInteger z2 = z1.subtract(q);
return int2octets(z2.signum() < 0 ? z1 : z2);
}
这里是 bits2int:
private BigInteger bits2int(byte[] in)
{
BigInteger v = new BigInteger(1, in);
int vlen = in.length * 8;
if (vlen > qlen) {
v = v.shiftRight(vlen - qlen);
}
return v;
}
这是问题:
q = 0x4000000000000000000020108A2E0CC0D99F8A5EF
h1 是 32 字节长。 q 是 21 个字节长。
因此 bits2int returns h1 的前 21 个字节。即
af2bdbe1aa9b6ec1e2ade1d694f41fc71a831d0268
将其转换为整数,然后减去 q,得到:
af2bdbe1aa9b6ec1e2ade1d694f41fc71a831d0268
- 04000000000000000000020108A2E0CC0D99F8A5EF
------------------------------------------
ab2bdbe1aa9b6ec1e2addfd58c513efb0ce9245c79
结果为正,因此保留 - z2。
然后调用 int2octets()。
private byte[] int2octets(BigInteger v)
{
byte[] out = v.toByteArray();
if (out.length < rolen) {
byte[] out2 = new byte[rolen];
System.arraycopy(out, 0,
out2, rolen - out.length,
out.length);
return out2;
} else if (out.length > rolen) {
byte[] out2 = new byte[rolen];
System.arraycopy(out, out.length - rolen,
out2, 0, rolen);
return out2;
} else {
return out;
}
}
q 和 v 大小相同,所以 ab2bdbe1aa9b6ec1e2addfd58c513efb0ce9245c79 被退回。但这不是测试向量所说的:
bits2octets(h1)
01 79 5E DF 0D 54 DB 76 0F 15 6D 0D AC 04 C0 32
2B 3A 20 42 24
我不明白。我的分析有没有搞砸?
获得的输出为(0xaf2b...d1bf >> (256 - 163)) mod q = 0x0179...4224
。你的错误是假设 bits2int
移动了 bytes 而不是 bits.