|
|
|
|
Strumenti |
09-03-2021, 19:49 | #1 |
Senior Member
Iscritto dal: Nov 2004
Città: Ancona
Messaggi: 3071
|
problema numeri molto grandi in c++
ciao a tutti,
ho questo problema. Ho realizzato un codice in c++ per la risoluzione dell'algoritmo di cifratura RSA, ma sbaglia a fare i calcoli perché vengono risultati molto grandi e nonostante come tipo dato ho messo unsigned long long int non funziona bene. Qualcuno potrebbe aiutarmi a risolvere? grazie
__________________
Affari OK: Ezran Tobruk! G30 VecchioEric BTinside GeneraleMarkus cristianobon70 Theodorakis accord62- Affare KO: Russo30 |
10-03-2021, 11:15 | #2 |
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2275
|
supponendo che sia davvero questo l'errore, perchè non butti un occhio su qualche libreria bigint?
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
10-03-2021, 12:23 | #3 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 2984
|
Puoi postare il codice che hai fatto per farci un idea?
|
10-03-2021, 20:35 | #4 |
Senior Member
Iscritto dal: Nov 2004
Città: Ancona
Messaggi: 3071
|
#include <iostream>
#include <sstream> #include <string> #include <cstdlib> #include <cmath> using namespace std; int MCD(int a, int b) { int risultato, resto; while (b != 0) { resto = a % b; a = b; b = resto; } risultato = a; return risultato; } int main () { #define MAX 2000 int N1, N2, mcd, i, k, p, q, n, fi, r, e, d, m; unsigned long long int tc, td; int coprimi[MAX]; for (i=0;i<MAX;i++) { coprimi[i]=0;} //per inizializzare a 0 il vettore MAX // ----- VERIFICA se 2 numeri sono COPRIMI cioè MCD=1 ---------- cout << "Inserire il 1° numero: "; cin >> N1; cout << "Inserire il 2° numero: "; cin >> N2; mcd=MCD(N1,N2); cout << "Il MCD e': " << mcd<<endl; if (mcd==1) {cout << N1<<" e "<<N2<<" sono coprimi"<<endl;} if (mcd!=1) {cout << N1<<" e "<<N2<<" non sono coprimi"<<endl;} // --------------------------- // ---- ALGORITMO RSA -------- cout << "\n\nALGORITMO RSA"<<endl; cout << "Inserire il numero primo p: "; cin >> p; cout << "Inserire il numero primo q: "; cin >> q; n=p*q; fi=(p-1)*(q-1); // formula di eulero per determinare fi(n) cout << "n = " << p<<" * "<<q<<" = "<<n<<endl; p--;q--; cout << "fi(n) = " << p<<" * "<<q<<" = "<<fi<<" coprimi "<<endl; // determina tutti i numeri comprimi di n e li inserisce nel vettore coprimi i=1;k=0; while (i<=n){ mcd=MCD(i,n); if (mcd==1) {coprimi[k]=i; k=k+1; } i++; } cout<<"\nVisualizzo gli elementi coprimi \n"; for (i=0;i<MAX;i++) { if (coprimi[i]!=0) cout<<coprimi[i]<<'\t'; } cout<<"\nscegli chiave pubblica = "; cin>>e; //determina la chiave privata k=0; while (k>=0){ r=(k*fi+1)%e; cout<<k<<"\t"<<r<<endl; if (r==0) { d=(k*fi+1)/e; k=-10;} else k++; } cout<<"\nLa chiave privata = "<<d<<endl; cout<<"\nscegli m = "; cin>>m; tc=pow(m,e); tc=tc%n; td=pow(tc,d); td=td%n; cout<<"messaggio cifrato = "<<tc<<endl; cout<<"messaggio decifrato = "<<td<<endl; return 0; }
__________________
Affari OK: Ezran Tobruk! G30 VecchioEric BTinside GeneraleMarkus cristianobon70 Theodorakis accord62- Affare KO: Russo30 Ultima modifica di NuclearBlast : 10-03-2021 alle 20:38. |
10-03-2021, 21:07 | #5 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3593
|
guardando qui con unsigned long long int hai a disposizione 64 bit ma si può arrivare a 128, compilatore permettendo.
Dovresti identare il codice per una migliore lettura e comprensione Codice:
#include <iostream> #include <sstream> #include <string> #include <cstdlib> #include <cmath> using namespace std; int MCD(int a, int b) { int risultato, resto; while (b != 0) { resto = a % b; a = b; b = resto; } risultato = a; return risultato; } int main () { #define MAX 2000 int N1, N2, mcd, i, k, p, q, n, fi, r, e, d, m; unsigned long long int tc, td; int coprimi[MAX]; for (i=0;i<MAX;i++) { coprimi[i]=0;} //per inizializzare a 0 il vettore MAX // ----- VERIFICA se 2 numeri sono COPRIMI cioè MCD=1 ---------- cout << "Inserire il 1° numero: "; cin >> N1; cout << "Inserire il 2° numero: "; cin >> N2; mcd=MCD(N1,N2); cout << "Il MCD e': " << mcd<<endl; if (mcd==1) {cout << N1<<" e "<<N2<<" sono coprimi"<<endl;} if (mcd!=1) {cout << N1<<" e "<<N2<<" non sono coprimi"<<endl;} // --------------------------- // ---- ALGORITMO RSA -------- cout << "\n\nALGORITMO RSA"<<endl; cout << "Inserire il numero primo p: "; cin >> p; cout << "Inserire il numero primo q: "; cin >> q; n=p*q; fi=(p-1)*(q-1); // formula di eulero per determinare fi(n) cout << "n = " << p<<" * "<<q<<" = "<<n<<endl; p--;q--; cout << "fi(n) = " << p<<" * "<<q<<" = "<<fi<<" coprimi "<<endl; // determina tutti i numeri comprimi di n e li inserisce nel vettore coprimi i=1;k=0; while (i<=n){ mcd=MCD(i,n); if (mcd==1) {coprimi[k]=i; k=k+1; } i++; } cout<<"\nVisualizzo gli elementi coprimi \n"; for (i=0;i<MAX;i++) { if (coprimi[i]!=0) cout<<coprimi[i]<<'\t'; } cout<<"\nscegli chiave pubblica = "; cin>>e; //determina la chiave privata k=0; while (k>=0){ r=(k*fi+1)%e; cout<<k<<"\t"<<r<<endl; if (r==0) { d=(k*fi+1)/e; k=-10;} else k++; } cout<<"\nLa chiave privata = "<<d<<endl; cout<<"\nscegli m = "; cin>>m; tc=pow(m,e); tc=tc%n; td=pow(tc,d); td=td%n; cout<<"messaggio cifrato = "<<tc<<endl; cout<<"messaggio decifrato = "<<td<<endl; return 0; } Ultima modifica di misterx : 10-03-2021 alle 21:10. |
11-03-2021, 13:20 | #6 |
Senior Member
Iscritto dal: Nov 2004
Città: Ancona
Messaggi: 3071
|
e come si fa a portare a 128 bit?
__________________
Affari OK: Ezran Tobruk! G30 VecchioEric BTinside GeneraleMarkus cristianobon70 Theodorakis accord62- Affare KO: Russo30 |
11-03-2021, 15:40 | #7 |
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2275
|
in ogni caso, la chiave di tutto è questa
Codice PHP:
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
26-04-2022, 16:24 | #8 |
Member
Iscritto dal: Sep 2005
Messaggi: 80
|
problema numeri molto grandi in c++
Ho avuto lo stesso problema nello scrivere classi che implementano RSA e l'ho risolto usando le librerie BOOST (https://www.boost.org/) che consentono di maneggiare numeri lunghi 1048 bit o maggiori.
ADL |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:45.