SJCL: converti ascii in un BitArray e calcola numeri casuali

3

Sto usando la libreria di crittografia Javascript di Stanford e vorrei maggiori informazioni a riguardo.

1.) Ho un testo ASCII e una chiave casuale a 128 bit. Voglio concatenare queste due cose, quindi converto il testo ASCII in esadecimale e poi in un BitArray.
Esempio: var text="kheil" ; var textHex=asc2hex(text);var textBitArray= sjcl.codec.hex.toBits(textHex);
Ottengo il seguente BitArray: 1802003817,8797904961536 .
Ciò che mi preoccupa è l'ultimo numero, perché è più lungo? È più di un numero a 32 bit. Con un po 'di testo ASCII, va bene, ho un BitArray con numeri a 32 bit, ma con altri ottengo questo tipo di suff, è normale? E se concatro con un numero casuale: -96822511,1783357814,2009621896,-1425360948 , ottengo: 1802003817,1828338331,292178913,1987561573,-2002056521,8795220606976 che non è una buona concatenazione no? La mia ipotesi è che il testo non sia un multiplo di 32 bit, ma come ottenere un buon BitArray per qualsiasi testo?

2.) Anche per calcolare una chiave casuale a 128 bit uso sjcl.random.randomWord (4,0), è una funzione efficiente per calcolare una chiave casuale? Ho letto da qualche parte che non dovrei usare 0 come paranoia, o è necessario chiamare startCollector () per ottenere entropia. Sono un po 'confuso a riguardo, qualcuno potrebbe spiegarmelo?

Grazie!

    
posta Kheil 04.07.2013 - 01:52
fonte

2 risposte

5

Senza guardare i numeri esatti, lascia che ti indichi perché questo sta accadendo:

  1. Secondo i documenti , a volte userà alcuni bit aggiuntivi per memorizzare ulteriori informazioni (vale a dire il numero effettivo di byte):

    Most of our crypto primitives operate on arrays of 4-byte words internally, but many of them can take arguments that are not a multiple of 4 bytes. This library encodes arrays of bits (whose size need not be a multiple of 8 bits) as arrays of 32-bit words. The bits are packed, big-endian, into an array of words, 32 bits at a time. Since the words are double-precision floating point numbers, they fit some extra data. We use this (in a private, possibly-changing manner) to encode the number of bits actually present in the last word of the array.

    Because bitwise ops clear this out-of-band data, these arrays can be passed to ciphers like AES which want arrays of words.

    Questo probabilmente spiega il bit in più che viene aggiunto, e spiega anche perché concatenare due BitArray s non semplicemente concatenano gli array di parole, come sembra che ti aspetti. Se il primo aveva in realtà un multiplo di 4 byte, allora sì, è quello che succederebbe.

  2. Se ricordo male, SJCL proverà ad usare la funzionalità crittografica dei browser moderni per creare il suo generatore di numeri casuali, ricadendo su uno personalizzato (che usa il movimento del mouse, le sequenze di tasti, ecc. per generare un'ulteriore entropia per essere combinato con un PRNG [non crittografico]). Ciò significa che nel browser moderno non è importante se si imposta paranoia o meno. Sui browser più vecchi (o che non supportano crypto ), allora devi davvero mettere in funzione i collector se prevedi di utilizzare algoritmi che dipendono da un CSPRNG. Ti aiuterò di più, ma non ho mai usato questa funzionalità da solo, quindi posso indirizzarti solo a i documenti .

P.S. US-ASCII è un sottoinsieme di UTF-8, quindi non è necessario convertirlo prima in Hex e poi in un BitArray. Usa solo sjcl.codec.utf8String.toBits(str) . (a pensarci bene, come sai che il tuo testo è in realtà ASCII? SJCL [normalmente] gira in un browser ... Meglio essere sicuro, e rendere il tuo codice conforme a Unicode)

    
risposta data 04.07.2013 - 05:29
fonte
0

Il motivo per cui BitArray contiene ints > 32bits è che codec.hex.toBits presuppone che la stringa esadecimale fornita abbia una lunghezza che è un multiplo di 8. Presumibilmente questo è dovuto al fatto che il codec è destinato all'uso interno ma io pensavo di lo menzionerei qui perché non ho trovato alcuna indicazione di questa limitazione in nessun'altra documentazione o discussione di SJCL.

Per eseguire testo arbitrario attraverso i bit, è possibile azzerare la parte anteriore della rappresentazione della stringa esadecimale per ottenere una stringa esadecimale di lunghezza% 8 = 0.

    
risposta data 03.09.2013 - 01:33
fonte

Leggi altre domande sui tag