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.