2016-12-27 2 views
1

J'essaie de suivre section A.1.2 of RFC 6979 et j'ai quelques difficultés.difficulté à comprendre l'exemple dans RFC 6979

Alors h1 est la suivante:

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 

Si c'est géré par bits2octets(h1) vous êtes censé obtenir ceci:

01 79 5E DF 0D 54 DB 76 0F 15 6D 0D AC 04 C0 32 
    2B 3A 20 42 24 

Je ne comprends pas comment.

est ici bits2octets défini en Java (à partir de la RFC):

 private byte[] bits2octets(byte[] in) 
     { 
       BigInteger z1 = bits2int(in); 
       BigInteger z2 = z1.subtract(q); 
       return int2octets(z2.signum() < 0 ? z1 : z2); 
     } 

est ici 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 est de 32 octets. q est long de 21 octets. Donc bits2int retourne les 21 premiers octets de h1. c'est à dire.

af2bdbe1aa9b6ec1e2ade1d694f41fc71a831d0268 

convertir en un entier, puis soustrayez q et vous obtenez ceci:

af2bdbe1aa9b6ec1e2ade1d694f41fc71a831d0268 
- 04000000000000000000020108A2E0CC0D99F8A5EF 
    ------------------------------------------ 
    ab2bdbe1aa9b6ec1e2addfd58c513efb0ce9245c79 

Le résultat est positif il - z2 - est maintenue.

Puis int2octets() est appelée.

 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 et v sont de la même taille si ab2bdbe1aa9b6ec1e2addfd58c513efb0ce9245c79 est retourné. Mais ce n'est pas ce que dit le vecteur de test:

bits2octets(h1) 
     01 79 5E DF 0D 54 DB 76 0F 15 6D 0D AC 04 C0 32 
     2B 3A 20 42 24 

Je ne comprends pas. Ai-je raté quelque part dans mon analyse?

Répondre

2

La sortie est obtenue en tant que (0xaf2b...d1bf >> (256 - 163)) mod q = 0x0179...4224. Votre erreur supposait bits2int décalé octets au lieu de bits.