Crittografia Blum Blum Shub

Stato
Discussione chiusa ad ulteriori risposte.

Oromis92

Utente Silver
22 Dicembre 2007
102
12
2
84
salve.
oggi volevo esporvi l'algoritmo Blum Blum Shub, uno dei pochi generatore di numeri pseudocasuali crittograficamente sicuri.

Innanzitutto si scelgono due numeri primi molto grandi, p e q, tali che, se divisi per 4 abbiano un resto 3, ovvero

p ≡ q ≡ 3(mod 4)

ovvero

(p mod 4) = (q mod 4) = 3

per esempio, i numeri primi 7 e 11 soddisfano la relazione 7 ≡ 11 ≡ 3(mod 4)

poi definisco n come

n = p * q

poi si sceglie un numero casuale s tale che

MCD(s,n) = 1

ovvero s ed n devono essere coprimi, o per meglio dire nè p nè q devono essere fattori di s

quindi il generatore BBS produce una seguenza di bit B_i sulla base del seguente algoritmo:

X_0 = s^2 mod n
for i=1 to ∞ {
X_i = (X_i-1)^2 mod n
B_i = X_i mod 2
}


fare il modulo di due indica in pratica: prendi 1 se il numero è dispari, 0 se è pari. in pratica prendo il bit meno significativo del numero generato.

L'algoritmo BBS è un generatore di bit pseudocasuali sicuro dal punto di vista crittografico.
un algoritmo di questo tipo deve passare il cosiddetto "test del prossimp bit":
in pratica, dati i primi k it della seguenza, non esiste un algoritmo realistico in grado di stabilire che il prossimo bit sarà 1 (o 0) con una probabilità maggiore di ½. Ai fini pratici, la sequenza risulta imprevedibile.

tuttavia, posso trovare l' X_esimo numero della sequenza, senza generarla tutta:

6f7bec5a93233883f8cbc5bdf23c291f.png


che vi sia utile ;)
 
a cjhe serve tutto questo ? comq like meritato !
Metti like ad una cosa che non sai cos'è? Alquanto ridicolo. Comunque sia è un linguaggio di Decrypt scritto contro i soldi calcolatori,molto più efficace(a parer mio) dell'MD5 , la quale formula matematica è facilmente decriptabile:

Inizializzazione del buffer MD: questo buffer è composto da 4 word a 32 bit, inizializzate come segue:A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 65 32 10
Elaborazione del messaggio:Vengono definite quattro funzioni che ricevono in ingresso tre word e ne restituiscono una:
F(x,y,z) = (x AND y) OR(NOTx OR z)
G(x,y,z) = (x AND z) OR(y OR NOTz)
H(x,y,z) = (x XOR y XOR z)
I(x,y,z) = y XOR(x OR NOTz)
In particolare ogni funzione adotta la seguente logica: se è vero x, allora passa ad y altrimenti a z. Ecco lo pseudocode dell’algoritmo:


//Nota: Tutte le variabili sono "unsigned" da 32 bit
var int[64] r, k//r specifica lo spostamento per iterazione
r[ 0..15] := {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22}
r[16..31] := {5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20}
r[32..47] := {4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23}
r[48..63] := {6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}


//Usa la parte binaria intera del seno di interi come costante:
for i from 0 to 63
k := floor(abs(sin(i + 1)) × (2 pow 32))


//Inizializzazione
var int h0 := 0x67452301
var int h1 := 0xEFCDAB89
var int h2 := 0x98BADCFE
var int h3 := 0x10325476


//Pre-processazione
append "1" bit to message
append "0" bits until message length in bits ≡ 448 (mod 512)
append bit (bit, not byte) length of unpadded message as 64-bit little-endian integer to message


//Processa il messaggio in pezzi da 512
for each 512-bit chunk of message
break chunk into sixteen 32-bit little-endian words w, 0 ≤ i ≤ 15


//inizializza il valore dell'hash di questo pezzo
var int a := h0
var int b := h1
var int c := h2
var int d := h3


//Main loop:
for i from 0 to 63
if 0 ≤ i ≤ 15 then
f := (b and c) or ((not b) and d)
g := i
else if 16 ≤ i ≤ 31
f := (d and b) or ((not d) and c)
g := (5×i + 1) mod 16
else if 32 ≤ i ≤ 47
f := b xor c xor d
g := (3×i + 5) mod 16
else if 48 ≤ i ≤ 63
f := c xor (b or (not d))
g := (7×i) mod 16


temp := d
d := c
c := b
b := b + leftrotate((a + f + k + w[g]) , r)
a := temp


//Aggiunge questa parte di hash al risultato
h0 := h0 + a
h1 := h1 + b
h2 := h2 + c
h3 := h3 + d


var int digest := h0 append h1 append h2 append h3
//(expressed as little-endian)


//Definizione della funzione "leftrotate"
leftrotate (x, c)
return (x <> (32-c));



Message Digest: L’output dell’algoritmo è l’hash finale,ottenuto a partire dal LSB (byte meno importante) della word A seguito da b ,c e terminante con il byte più importante di D.Fonti:


 
  • Mi piace
Reazioni: blirk3000
Stato
Discussione chiusa ad ulteriori risposte.