Question

J'ai un 56 bits en une chaîne binaire que je veux utiliser comme clé secrète pour le cryptage.

J'ai trouvé le code suivant à la JCA docs site web

byte[] desKeyData = { (byte)0x01, (byte)0x02, (byte)0x03, 
(byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08 };
DESKeySpec desKeySpec = new DESKeySpec(desKeyData);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

Cependant il utilise des 8 octets de la clé (au lieu de 7).Il n'est pas clair si le desKeyData[0] correspond à l'octet le moins significatif ou le plus important.Aussi, est-il possible d'utiliser les 56 bits chaîne directement pour générer le tableau d'octets qui peuvent être utilisés à cette fin ?

Était-ce utile?

La solution

de Wikipedia :

La clé se compose de 64 bits;Cependant, seuls 56 d'entre eux sont effectivement utilisés par l'algorithme.Huit bits sont utilisés uniquement pour la vérification de la parité et sont ensuite supprimés.Par conséquent, la longueur de la clé efficace est de 56 bits et il n'est jamais cité en tant que tel.Chaque 8e bit de la clé sélectionnée est jeté, c'est-à-dire que les positions 8, 16, 24, 32, 40, 48, 56, 64 sont retirées de la clé 64 bits, laissant uniquement la touche 56 bits.

Ainsi, les bits les moins significatifs (c'est-à-dire des bits de 0ème) ne sont pas utilisés pour la construction de clé, ils peuvent être utilisés pour vérifier la parité par gen 11 / p>

EDIT: test simple montrant que les bits les moins significatifs sont ignorés:

SecretKeyFactory sf = SecretKeyFactory.getInstance("DES");
byte[] in = "test".getBytes("UTF-8");

Cipher c1 = Cipher.getInstance("DES");
c1.init(Cipher.ENCRYPT_MODE, sf.generateSecret(new DESKeySpec(
   new byte[] {0x10,0x20,0x30,0x40,0x50,0x60,0x70,(byte) 0x80})));
byte[] r1 = c1.doFinal(in);

Cipher c2 = Cipher.getInstance("DES");
c2.init(Cipher.ENCRYPT_MODE, sf.generateSecret(new DESKeySpec(
    new byte[] {0x11,0x21,0x31,0x41,0x51,0x61,0x71,(byte) 0x81})));
byte[] r2 = c2.doFinal(in);

assertArrayEquals(r1, r2);  

Autres conseils

Un bit significatif est celui qui change le signe d'un un ou en complément à deux numéro.L'idée d'une plus-ou-bit le moins significatif ne peut être appliquée à d'octets.

Comme axtavt réponse dit, de toutes les 64 bits de la séquence seuls les bits dans les gammes: (1..7), (9..15), (17..23), (25..31), (33..39), (41..47), (49..55), (57..63) sont utilisés comme la véritable Clé.Par exemple, l'56 pertinentes bits de la séquence tournée à 1 sont: 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, en laissant les bits les plus significatifs de zéro que de contrôle de parité.

Effectivement convertir un 7 octets, 56 bits de la séquence 8 séquence d'octets que vous pouvez utiliser ce code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top