Il credito va a La risposta di Jeff per i dettagli e La risposta di Steve che è stata anche utile. Il credito va anche a la risposta di tylerl che includeva collegamenti a Wikipedia per tutte le funzioni, in particolare modInverse
, inoltre ha chiarito l'ambiguità punto di partenza per e
. Grazie, ho upvoted le tue risposte e, utilizzando le informazioni combinate di tutte e tre le risposte, ho creato quello che spero sia una risposta migliore.
La chiave per rendere reverse-engineering così costoso sta usando power-of . La radice quadrata non è così difficile, la potenza di 3 significa che hai bisogno di una radice cubica, ma la potenza di 34.051.489 è piuttosto difficile. Esistono altre operazioni matematiche difficili da decodificare. Ci sono anche diversi modi per creare un algoritmo asimmetrico, ma questa risposta si concentra su RSA. Il più vecchio e il più comune.
Algoritmo RSA (basato su il codice Java )
I seguenti calcoli devono essere eseguiti con numeri interi precisi arbitrari . (Come BigInt o BigInteger)
Generazione delle chiavi:
- La lunghezza della chiave costante è
l
.
- Di solito costante
e_start
può =3
per semplicità. Tuttavia, 0x10001
è più comune, in ogni caso, un numero primo è il migliore (per motivi di prestazioni di generazione di chiavi e probabilmente altri motivi).
-
p
e q
sono i numeri primi positivi generati casualmente, che richiedono fino a l
bit per la memorizzazione. (Per mantenere questi positivi, il primo bit sarà sempre 0
)
-
n
= p*q
Viene utilizzato sia per la crittografia che per la decrittografia.
-
e
inizia come e_start
. Questo alla fine sarà la parte della chiave di crittografia.
-
m
= (p-1)*(q-1)
è usato per convertire e
in d
, che sarà usato per la decrittazione.
-
while(
gcd
(e,m)>1){e+=2}
Questo è necessario per il prossimo passo di lavoro.
-
d=
modInverse
(e,m)
Esegue un'operazione aritmetica standard. Probabilmente non vale la pena esaminare molto, specialmente se il tuo linguaggio di programmazione ha questo incorporato
Per crittografare o decrittografare, converti prima i tuoi byte in un singolo intero di precisione arbitrario.
Crittografia: encrypted=(plain^e)%n
Nota: se plain>=n
, devi dividere plain
in due o più valori più piccoli e crittografarli separatamente.
Decrittografia: plain=(encrypted^d)%n
La crittografia asimmetrica è in genere meno efficiente della crittografia simmetrica. A volte la crittografia asimmetrica viene utilizzata solo per lo scambio di chiavi.