Domanda

Ho una stringa binaria a 56 bit che voglio usare come chiave segreta per la crittografia Des.

Ho trovato il seguente codice sul sito Web JCA Docs

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

Tuttavia, questo utilizza 8 byte per la chiave (anziché 7). Non è chiaro se DeskeyData [0] corrisponde al byte meno significativo o al più significativo. Inoltre, è possibile utilizzare direttamente la stringa a 56 bit per generare l'array di byte che può essere utilizzato a questo scopo?

È stato utile?

Soluzione

Da Wikipedia:

La chiave apparentemente è costituita da 64 bit; Tuttavia, solo 56 di questi sono effettivamente utilizzati dall'algoritmo. Otto bit vengono utilizzati esclusivamente per il controllo della parità e successivamente sono scartati. Quindi la lunghezza della chiave effettiva è di 56 bit e non viene mai citata come tale. Ogni 8 ° bit della chiave selezionata viene scartato, IE Posizioni 8, 16, 24, 32, 40, 48, 56, 64 viene rimosso dal tasto a 64 bit lasciando alle spalle solo il tasto a 56 bit.

Quindi, i bit meno significativi (cioè 0 ° bit) non sono usati per la costruzione chiave, possono essere utilizzati per controllare la parità da DESKeySpec.isParityAdjusted().

MODIFICARE: Test semplice che mostra che i bit meno significativi vengono ignorati:

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

Altri suggerimenti

Un bit significativo è quello che cambia il segno di a uno o il complemento di due numero. L'idea di un bit significativo più o-est non può essere applicata ai byte.

Come dice Axtavt Risposta, da tutti i 64 bit della sequenza solo i bit nelle gamme: (1..7), (9..15), (17..23), (25..31), (33..39), (41..47), (49..55), (57..63) sono usati come chiave effettiva. Ad esempio, i 56 bit rilevanti sulla sequenza trasformati a 1 sono: 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, lasciando i bit più significativi a zero come controllo di parità.

Per convertire effettivamente una sequenza di 7 byte, 56 bit in una sequenza a 8 byte che puoi usare Questo codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top