难以理解RFC 6979中的示例

时间:2016-12-27 06:01:34

标签: signature dsa

我试图关注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(来自RFC)中定义的bits2octets:

      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;
      }

Heres q:

  q = 0x4000000000000000000020108A2E0CC0D99F8A5EF

h1是32个字节长。 q长21个字节。

因此bits2int返回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

我不明白。我在某处的分析中搞砸了吗?

1 个答案:

答案 0 :(得分:2)

输出为(0xaf2b...d1bf >> (256 - 163)) mod q = 0x0179...4224。你的错误是假设bits2int移位字节而不是