logo

Algorithme RSA en cryptographie

Algorithme RSA est un algorithme de cryptographie asymétrique. Asymétrique signifie en fait qu'il fonctionne sur deux touches différentes, c'est-à-dire Clé publique et Clé privée. Comme son nom l'indique, la clé publique est donnée à tout le monde et la clé privée reste privée.

que signifie xdxd

Un exemple de cryptographie asymétrique :



  1. Un client (par exemple un navigateur) envoie sa clé publique au serveur et demande certaines données.
  2. Le serveur crypte les données à l'aide de la clé publique du client et envoie les données cryptées.
  3. Le client reçoit ces données et les décrypte.

Comme ceci est asymétrique, personne d’autre que le navigateur ne peut décrypter les données même si un tiers possède la clé publique du navigateur.

L'idée! L’idée du RSA repose sur le fait qu’il est difficile de factoriser un grand entier. La clé publique est constituée de deux nombres dont un nombre est une multiplication de deux grands nombres premiers. Et la clé privée est également dérivée des deux mêmes nombres premiers. Donc, si quelqu’un parvient à factoriser un grand nombre, la clé privée est compromise. Par conséquent, la force du cryptage dépend entièrement de la taille de la clé et si nous doublons ou triplons la taille de la clé, la force du cryptage augmente de façon exponentielle. Les clés RSA peuvent généralement avoir une longueur de 1 024 ou 2 048 bits, mais les experts estiment que les clés de 1 024 bits pourraient être cassées dans un avenir proche. Mais jusqu’à présent, cela semble être une tâche irréalisable.

Apprenons le mécanisme derrière l'algorithme RSA :>> Génération de clé publique :



Select two prime no's. Suppose   P = 53 and Q = 59.    Now First part of the Public key : n = P*Q = 3127.   We also need a small exponent say   e :     But e Must be     An integer.    Not be a factor of Φ(n).     1     Φ(n) [Φ(n) is discussed below],  >> Génération de clé privée : nous devons calculer Φ(n) : tel que Φ(n) = (P-1)(Q-1) donc, Φ(n) = 3016 Calculons maintenant la clé privée, d : d = (k *Φ(n) + 1) / e pour un entier k Pour k = 2, la valeur de d est 2011. Nous sommes maintenant prêts avec notre – Clé publique ( n = 3127 et e = 3) et Clé privée (d = 2011 ) Maintenant nous allons crypter HI : Convertir les lettres en chiffres : H = 8 et I = 9 Ainsi les données cryptées c = (89 e )mod n Ainsi nos données cryptées s'avèrent être 1394 Maintenant, nous allons décrypter 1394 : Données décryptées = (c d )mod n Ainsi, nos données cryptées sont 89 8 = H et I = 9, c'est-à-dire 'HI'.    Vous trouverez ci-dessous l'implémentation de l'algorithme RSA pour la méthode 1 : Cryptage et déchiffrement de petites valeurs numériques : C++ // Programme C pour l'algorithme cryptographique asymétrique RSA //. Pour la démonstration, les valeurs sont // relativement petites par rapport à // l'application pratique #include utilisant l'espace de noms std; // Renvoie le pgcd de a et b int gcd(int a, int h) { int temp;  tandis que (1) { temp = a % h;  si (temp == 0) renvoie h ;  une = h;  h = température ;  } } // Code pour démontrer l'algorithme RSA int main() { // Deux nombres premiers aléatoires double p = 3;  double q = 7 ;  // Première partie de la clé publique : double n = p * q;  // Recherche d'une autre partie de la clé publique.  // e signifie chiffrer double e = 2 ;  double phi = (p - 1) * (q - 1) ;  while (e // e doit être co-premier à phi et // plus petit que phi. if (gcd(e, phi) == 1) break; else e++; } // Clé privée (d signifie décrypter) // choisir d tel qu'il satisfasse // d*e = 1 + k * totient int k = 2; // Une valeur constante double d = (1 + (k * phi)) / e // Message à chiffrer double msg; = 12; printf('Données du message = %lf', msg); // Chiffrement c = (msg ^ e) % n double c = pow(msg, e); ('
Données cryptées = %lf', c); // Décryptage m = (c ^ d) % n double m = pow(c, d); m = fmod(m, n); 
Original Message Sent = %lf', m); return 0; } // Ce code est fourni par Akash Sharan. /*package quel que soit //n'écrivez pas le nom du package ici */ import java.io.*; java.math.*; import java.util.*; /* * Programme Java pour l'algorithme cryptographique asymétrique RSA. * Pour la démonstration, les valeurs sont * relativement petites par rapport à l'application pratique */ public class GFG { public static double pgcd(double a , double h) { /* * Cette fonction renvoie le pgcd ou le plus grand diviseur commun */ double temp;  while (vrai) { temp = a % h;  si (temp == 0) renvoie h ;  une = h;  h = température ;  } } public static void main(String[] args) { double p = 3;  double q = 7 ;  // Stocke la première partie de la clé publique : double n = p * q;  // Recherche de l'autre partie de la clé publique.  // double e signifie chiffrer double e = 2 ;  double phi = (p - 1) * (q - 1) ;  while (e /* * e doit être co-premier à phi et * plus petit que phi. */ if (gcd(e, phi) == 1) break; else e++; } int k = 2; // Une valeur constante double d = (1 + (k * phi)) / e; // Message à chiffrer double msg = 12; System.out.println('Données du message = ' + msg); ^ e) % n double c = Math.pow(msg, e); c = c % n; System.out.println('Données cryptées = ' + c); % n double m = Math.pow(c, d); m = m % n; System.out.println('Original Message Sent = ' + m } } // Ce code est fourni par Pranay Arora. Python3 # Python pour l'algorithme cryptographique asymétrique RSA # Pour la démonstration, les valeurs sont # relativement petites par rapport à l'application pratique import math def gcd(a, h) : temp = 0 while(1) : temp = a % h if (temp == 0) : return h a = h h = temp p = 3 q = 7 n = p*q e = 2 phi = (p-1)*(q-1) tandis que (e # e doit être co-premier à phi et # plus petit que phi. if(gcd(e, phi) == 1): break else: e = e+1 # Clé privée (d signifie décrypter) # choisir d tel qu'il satisfasse # d*e = 1 + k * totient k = 2 d = (1 + (k*phi))/e # Message à chiffrer msg = 12.0 print('Données du message = ', msg) # Chiffrement c = (msg ^ e) % n c = pow( msg, e) c = math.fmod(c, n) print('Données cryptées = ', c) # Décryptage m = (c ^ d) % n m = pow(c, d) m = math.fmod( m, n) print('Original Message Sent = ', m) # Ce code est fourni par Pranay Arora.  C# /* * Programme C# pour l'algorithme cryptographique asymétrique RSA.  * Pour la démonstration, les valeurs sont * relativement faibles par rapport à l'application pratique */ en utilisant System ; public class GFG { public static double pgcd(double a, double h) { /* * Cette fonction renvoie le pgcd ou le plus grand diviseur commun * */ double temp;  while (vrai) { temp = a % h;  si (temp == 0) renvoie h ;  une = h;  h = température ;  } } static void Main() { double p = 3;  double q = 7 ;  // Stocke la première partie de la clé publique : double n = p * q;  // Recherche de l'autre partie de la clé publique.  // double e signifie chiffrer double e = 2 ;  double phi = (p - 1) * (q - 1) ;  while (e /* * e doit être co-premier à phi et * plus petit que phi. */ if (gcd(e, phi) == 1) break; else e++; } int k = 2; // Une valeur constante double d = (1 + (k * phi)) / e; // Message à chiffrer double msg = 12; Console.WriteLine('Données du message = ' + String.Format('{0:F6} ', msg)); // Chiffrement c = (msg ^ e) % n double c = Math.Pow(msg, e); c = c % n; Console.WriteLine('Données cryptées = ' + String. Format('{0:F6}', c)); // Décryptage m = (c ^ d) % n double m = Math.Pow(c, d) ; Console.WriteLine( 'Original Message Sent = ' + String.Format('{0:F6}', m)); } } // Ce code est fourni par Pranay Arora //GFG //Code Javascript pour cette approche. function pgcd(a, h) { /* * Cette fonction renvoie le pgcd ou le plus grand diviseur commun */ let temp while (true) { temp = a % h; ; h = temp; } } let p = 3; let q = 7; // Stocke la première partie de la clé publique : let n = p * q; // Recherche de l'autre partie de la clé publique. // e signifie chiffrer soit e = 2 ; soit phi = (p - 1) * (q - 1); while (e /* * e doit être co-premier à phi et * plus petit que phi. */ if (gcd(e, phi) == 1) break; else e++; } let k = 2; // Une valeur constante let d = (1 + (k * phi)) / e; // Message à chiffrer let msg = 12; console.log('Données du message = ' + msg); // Chiffrement c = (msg ^ e) ) % n let c = Math.pow(msg, e); c = c % n; console.log('Données cryptées = ' + c); // Décryptage m = (c ^ d) % n let m = Math.pow(c, d); m = m % n; console.log('Original Message Sent = ' + m); //Ce code est écrit par Sundaram Output Message data = 12.000000 Données cryptées = 3.000000 Original Message envoyé = 12,000000 Méthode 2 : Chiffrement et déchiffrement des messages en texte brut contenant des alphabets et des chiffres en utilisant leur valeur ASCII : C++ #include en utilisant l'espace de noms std ; prime; // un ensemble sera la collection de nombres premiers, // où nous pouvons sélectionner des nombres premiers aléatoires p et q int public_key; int clé_privée ; entier n; // nous exécuterons la fonction une seule fois pour remplir l'ensemble des // nombres premiers void primefiller() { // la méthode utilisée pour remplir l'ensemble des nombres premiers est dérivée de // eratosthènes (une méthode pour collecter les nombres premiers) vecteur seive(250, vrai);  seive[0] = faux;  seive[1] = faux;  pour (int je = 2; je<250; i++) {  for (int j = i * 2; j <250; j += i) {  seive[j] = false;  }  } // filling the prime numbers  for (int i = 0; i   if (seive[i])  prime.insert(i);  } } // picking a random prime number and erasing that prime // number from list because p!=q int pickrandomprime() {  int k = rand() % prime.size();  auto it = prime.begin();  while (k--)  it++;  int ret = *it;  prime.erase(it);  return ret; } void setkeys() {  int prime1 = pickrandomprime(); // first prime number  int prime2 = pickrandomprime(); // second prime number  // to check the prime numbers selected  // cout<  n = prime1 * prime2;  int fi = (prime1 - 1) * (prime2 - 1);  int e = 2;  while (1) {  if (__gcd(e, fi) == 1)  break;  e++;  } // d = (k*Φ(n) + 1) / e for some integer k  public_key = e;  int d = 2;  while (1) {  if ((d * e) % fi == 1)  break;  d++;  }  private_key = d; } // to encrypt the given number long long int encrypt(double message) {  int e = public_key;  long long int encrpyted_text = 1;  while (e--) {  encrpyted_text *= message;  encrpyted_text %= n;  }  return encrpyted_text; } // to decrypt the given number long long int decrypt(int encrpyted_text) {  int d = private_key;  long long int decrypted = 1;  while (d--) {  decrypted *= encrpyted_text;  decrypted %= n;  }  return decrypted; } // first converting each character to its ASCII value and // then encoding it then decoding the number to get the // ASCII and converting it to character vector encodeur (message de chaîne) { vecteur formulaire;  // appel de la fonction de chiffrement dans la fonction de codage pour (auto& letter : message) form.push_back(encrypt((int)letter));  formulaire de retour ; } décodeur de chaîne (vecteur codé) { chaîne s;  // appel de la fonction de décryptage decoding function pour (auto& num : encoded) s += decrypt(num);  Retour; } int main() { primefiller();  setkeys();  chaîne message = 'Message de test';  // décommentez ci-dessous pour une saisie manuelle // cout<<'enter the message
';getline(cin,message);  // calling the encoding function  vector codé = encodeur (message);  cout<< 'Initial message:
' << message;  cout << '

The encoded message(encrypted by public '  'key)
';  for (auto& p : coded)  cout << p;  cout << '

The decoded message(decrypted by private '  'key)
';  cout << decoder(coded) << endl;  return 0; }  Java           import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Random; public class GFG {  private static HashSet prime = new HashSet();  private static Integer public_key = null;  private static Integer private_key = null;  private static Integer n = null;  private static Random random = new Random();  public static void main(String[] args)  {  primeFiller();  setKeys();  String message = 'Test Message';  // Uncomment below for manual input  // System.out.println('Enter the message:');  // message = new Scanner(System.in).nextLine();  List coded = encoder(message);  System.out.println('Initial message:');  System.out.println(message);  System.out.println(  '

The encoded message (encrypted by public key)
');  System.out.println(  String.join('', coded.stream()  .map(Object::toString)  .toArray(String[] ::new)));  System.out.println(  '

The decoded message (decrypted by public key)
');  System.out.println(decoder(coded));  }  public static void primeFiller()  {  boolean[] sieve = new boolean[250];  for (int i = 0; i <250; i++) {  sieve[i] = true;  }  sieve[0] = false;  sieve[1] = false;  for (int i = 2; i <250; i++) {  for (int j = i * 2; j <250; j += i) {  sieve[j] = false;  }  }  for (int i = 0; i   if (sieve[i]) {  prime.add(i);  }  }  }  public static int pickRandomPrime()  {  int k = random.nextInt(prime.size());  List primeList = new ArrayList(prime);  int ret = primeList.get(k);  prime.remove(ret);  return ret;  }  public static void setKeys()  {  int prime1 = pickRandomPrime();  int prime2 = pickRandomPrime();  n = prime1 * prime2;  int fi = (prime1 - 1) * (prime2 - 1);  int e = 2;  while (true) {  if (gcd(e, fi) == 1) {  break;  }  e += 1;  }  public_key = e;  int d = 2;  while (true) {  if ((d * e) % fi == 1) {  break;  }  d += 1;  }  private_key = d;  }  public static int encrypt(int message)  {  int e = public_key;  int encrypted_text = 1;  while (e>0) { texte_crypté *= message ;  texte_chiffré %= n ;  e-= 1 ;  } return texte_chiffré ;  } public static int décrypter(int selected_text) { int d = private_key;  int déchiffré = 1 ;  while (d> 0) { déchiffré *= texte_chiffré ;  décrypté %= n ;  ré -= 1 ;  } return décrypté ;  } public static int pgcd(int a, int b) { if (b == 0) { return a;  } return pgcd(b, a % b);  } Encodeur de liste statique public (message de chaîne) { Liste encodée = new ArrayList ();  for (char letter : message.toCharArray()) { encoded.add(encrypt((int)letter));  } return codé ;  } décodeur de chaîne statique public (liste codée) { StringBuilder s = new StringBuilder();  for (int num : encodé) { s.append((char)decrypt(num));  } return s.toString();  } } Python3 import random import math # Un ensemble sera la collection de nombres premiers, # où nous pouvons sélectionner des nombres premiers aléatoires p et q prime = set() public_key = Aucun private_key = Aucun n = Aucun # Nous n'exécuterons la fonction qu'une seule fois pour remplir l'ensemble des # nombres premiers def primefiller() : # La méthode utilisée pour remplir l'ensemble des nombres premiers est le tamis de # Eratosthène (une méthode pour collecter les nombres premiers) seive = [True] * 250 seive[0] = False seive[1 ] = Faux pour i in range(2, 250) : pour j in range(i * 2, 250, i) : seive[j] = False # Remplir les nombres premiers pour i in range(len(seive)) : if seive[i]: prime.add(i) # Choisir un nombre premier aléatoire et effacer ce nombre premier de la liste car p!=q def pickrandomprime(): global prime k = random.randint(0, len(prime) - 1) it = iter(prime) pour _ dans range(k) : next(it) ret = next(it) prime.remove(ret) return ret def setkeys() : global public_key, private_key, n prime1 = pickrandomprime() # Premier nombre premier prime2 = pickrandomprime() # Deuxième nombre premier n = prime1 * prime2 fi = (prime1 - 1) * (prime2 - 1) e = 2 while True : if math.gcd(e, fi) == 1 : break e += 1 # d = (k*Φ(n) + 1) / e pour un entier k public_key = e d = 2 while True : if (d * e) % fi == 1 : break d += 1 private_key = d # Pour crypter le numéro donné def encrypt(message): global public_key, n e = public_key approved_text = 1 while e> 0: approved_text *= message approved_text %= n e -= 1 return approved_text # Pour déchiffrer le numéro donné def decrypt( texte_crypté) : clé privée globale, n d = clé_privée déchiffrée = 1 tandis que d> 0 : déchiffré *= texte_crypté déchiffré %= n d -= 1 return déchiffré # Convertir d'abord chaque caractère en sa valeur ASCII et # puis l'encoder puis décoder le nombre pour obtenir le # ASCII et le convertir en caractère def encoder(message) : encoded = [] # Appel de la fonction de cryptage dans la fonction de codage pour la lettre dans le message : encoded.append(encrypt(ord(letter))) return encoded def decoder(encoded) : s = '' # Appel de la fonction de décryptage fonction de décodage pour num en codé : s += chr(decrypt(num)) return s if __name__ == '__main__' : primefiller() setkeys() message =  'Test Message' # Décommentez ci-dessous pour une saisie manuelle # message = input('Entrez le message
') # Appel de la fonction d'encodage coded = encoder(message) print('Message initial :') print(message ) print('

Le message codé (crypté par clé publique)
') print(''.join(str(p) for p in codé)) print('

Le décodé message (déchiffré par clé publique)
') print(''.join(str(p) for p in decoder(coded))) C# using System ; en utilisant System.Collections.Generic ; classe publique GFG { HashSet statique privé prime = nouveau HashSet ();  int statique privé ? clé_publique = null ;  int statique privé ? clé_privée = null ;  int statique privé ? n = nul ;  private static Random random = new Random();  public static void Main() { PrimeFiller();  SetKeys();  chaîne message = 'Message de test';  // Décommentez ci-dessous pour une saisie manuelle // Console.WriteLine('Entrez le message :');  // message = Console.ReadLine();  Liste codé = Encodeur (message);  Console.WriteLine('Message initial :');  Console.WriteLine(message);  Console.WriteLine('

Le message codé (chiffré par clé publique)
');  Console.WriteLine(string.Join('', codé));  Console.WriteLine('

Le message décodé (déchiffré par clé publique)
');  Console.WriteLine (Décoder (codé));  } public static void PrimeFiller() { bool[] sieve = new bool[250];  pour (int je = 0; je<250; i++)  {  sieve[i] = true;  }  sieve[0] = false;  sieve[1] = false;  for (int i = 2; i <250; i++)  {  for (int j = i * 2; j <250; j += i)  {  sieve[j] = false;  }  }  for (int i = 0; i   {  if (sieve[i])  {  prime.Add(i);  }  }  }  public static int PickRandomPrime()  {  int k = random.Next(0, prime.Count - 1);  var enumerator = prime.GetEnumerator();  for (int i = 0; i <= k; i++)  {  enumerator.MoveNext();  }  int ret = enumerator.Current;  prime.Remove(ret);  return ret;  }  public static void SetKeys()  {  int prime1 = PickRandomPrime();  int prime2 = PickRandomPrime();  n = prime1 * prime2;  int fi = (prime1 - 1) * (prime2 - 1);  int e = 2;  while (true)  {  if (GCD(e, fi) == 1)  {  break;  }  e += 1;  }  public_key = e;  int d = 2;  while (true)  {  if ((d * e) % fi == 1)  {  break;  }  d += 1;  }  private_key = d;  }  public static int Encrypt(int message)  {  int e = public_key.Value;  int encrypted_text = 1;  while (e>0) { texte_crypté *= message ;  texte_chiffré %= n.Valeur ;  e-= 1 ;  } return texte_chiffré ;  } public static int Decrypt(int selected_text) { int d = private_key.Value;  int déchiffré = 1 ;  while (d> 0) { déchiffré *= texte_chiffré ;  décrypté %= n.Value ;  ré -= 1 ;  } return décrypté ;  } public static int GCD(int a, int b) { if (b == 0) { return a;  } renvoie GCD(b, a % b);  } Liste statique publique Encodeur (message de chaîne) { Liste encodé = nouvelle liste ();  foreach (lettre de caractère dans le message) { encoded.Add(Encrypt((int)letter));  } return codé ;  } chaîne statique publique Décodeur(Liste codé) { chaîne s = '';  foreach (int num encodé) { s += (char)Decrypt(num);  }  Retour;  }} Sortie Message initial: Message de test Le message codé (chiffré par la clé publique) 863312887135951593413927434912887135951359583051879012887 Le message décoded (decrypte SA utilisant des racines primitives.   Étape 1 : Génération de clés Pour commencer, nous devons générer deux grands nombres premiers, p et q. Ces nombres premiers doivent être de longueur à peu près égale et leur produit doit être beaucoup plus grand que le message que nous voulons chiffrer. Nous pouvons générer les nombres premiers en utilisant n'importe quel algorithme de test de primalité, tel que le test de Miller-Rabin. Une fois que nous avons les deux nombres premiers, nous pouvons calculer leur produit n = p*q, qui sera le module de notre système RSA. Ensuite, nous devons choisir un entier e tel que 1. Pour calculer l'exposant de clé privée d, nous devons trouver un entier d tel que d*e = 1 (mod phi(n)). Cela peut être fait en utilisant l'algorithme euclidien étendu. Notre clé publique est (n, e) et notre clé privée est (n, d).   Étape 2 : Chiffrement Pour chiffrer un message m, nous devons le convertir en un entier compris entre 0 et n-1. Cela peut être fait en utilisant un schéma de codage réversible, tel que ASCII ou UTF-8. Une fois que nous avons la représentation entière du message, nous calculons le texte chiffré c comme c = m^e (mod n). Cela peut être réalisé efficacement à l'aide d'algorithmes d'exponentiation modulaire, tels que l'exponentiation binaire.   Étape 3 : Décryptage Pour déchiffrer le texte chiffré c, nous calculons le texte en clair m comme m = c^d (mod n). Encore une fois, nous pouvons utiliser des algorithmes d'exponentiation modulaire pour le faire efficacement.   Étape 4 : Exemple Passons en revue un exemple utilisant de petites valeurs pour illustrer le fonctionnement du système de cryptographie RSA. Supposons que nous choisissions p = 11 et q = 13, ce qui nous donne n = 143 et phi(n) = 120. Nous pouvons choisir e = 7, puisque pgcd(7, 120) = 1. En utilisant l'algorithme euclidien étendu, nous pouvons calculer d = 103, puisque 7*103 = 1 (mod 120). Notre clé publique est (143, 7) et notre clé privée est (143, 103). Supposons que nous voulions chiffrer le message BONJOUR. Nous pouvons convertir cela en entier 726564766, en utilisant le codage ASCII. En utilisant la clé publique, nous calculons le texte chiffré comme c = 726564766^7 (mod 143) = 32. Pour déchiffrer le texte chiffré, nous utilisons la clé privée pour calculer m = 32^103 (mod 143) = 726564766, qui est l'original. message. Exemple de code : C++ #include #include utilisant l'espace de noms std ; // calcule phi(n) pour un nombre donné n int phi(int n) { int result = n;  pour (int je = 2; je<= sqrt(n); i++) {  if (n % i == 0) {  while (n % i == 0) {  n /= i;  }  result -= result / i;  }  }  if (n>1) { résultat -= résultat / n ;  } renvoie le résultat ; } // calcule pgcd(a, b) en utilisant l'algorithme euclidien int gcd(int a, int b) { if (b == 0) { return a;  } return pgcd(b, a % b); } // calcule a^b mod m en utilisant l'exponentiation modulaire int modpow(int a, int b, int m) { int result = 1;  while (b> 0) { if (b & 1) { result = (result * a) % m;  } une = (une * une) % m ;  b>> = 1 ;  } renvoie le résultat ; } // génère une racine primitive aléatoire modulo n int generatePrimitiveRoot(int n) { int phiN = phi(n);  facteurs int[phiN], numFactors = 0 ;  int temp = phiN;  // récupère tous les facteurs premiers de phi(n) pour (int i = 2; i<= sqrt(temp); i++) {  if (temp % i == 0) {  factors[numFactors++] = i;  while (temp % i == 0) {  temp /= i;  }  }  }  if (temp>1) { facteurs[numFactors++] = temp;  } // teste les racines primitives possibles pour (int i = 2; i<= n; i++) {  bool isRoot = true;  for (int j = 0; j   if (modpow(i, phiN / factors[j], n) == 1) {  isRoot = false;  break;  }  }  if (isRoot) {  return i;  }  }  return -1; } int main() {  int p = 61;  int q = 53;  int n = p * q;  int phiN = (p - 1) * (q - 1);  int e = generatePrimitiveRoot(phiN);  int d = 0;  while ((d * e) % phiN != 1) {  d++;  }  cout << 'Public key: {' << e << ', ' << n << '}' << endl;  cout << 'Private key: {' << d << ', ' << n << '}' << endl;  int m = 123456;  int c = modpow(m, e, n);  int decrypted = modpow(c, d, n);  cout << 'Original message: ' << m << endl;  cout << 'Encrypted message: ' << c << endl;  cout << 'Decrypted message: ' << decrypted << endl;  return 0; }  Output:  Public key: {3, 3233} Private key: {2011, 3233} Original message: 123456 Encrypted message: 855 Decrypted message: 123456   Advantages:    Security:   RSA algorithm is considered to be very secure and is widely used for secure data transmission.   Public-key cryptography:   RSA algorithm is a public-key cryptography algorithm, which means that it uses two different keys for encryption and decryption. The public key is used to encrypt the data, while the private key is used to decrypt the data.   Key exchange:   RSA algorithm can be used for secure key exchange, which means that two parties can exchange a secret key without actually sending the key over the network.   Digital signatures:   RSA algorithm can be used for digital signatures, which means that a sender can sign a message using their private key, and the receiver can verify the signature using the sender’s public key.   Speed:   The RSA technique is suited for usage in real-time applications since it is quite quick and effective.   Widely used:   Online banking, e-commerce, and secure communications are just a few fields and applications where the RSA algorithm is extensively developed.  Disadvantages:    Slow processing speed:   RSA algorithm is slower than other encryption algorithms, especially when dealing with large amounts of data.   Large key size:   RSA algorithm requires large key sizes to be secure, which means that it requires more computational resources and storage space.   Vulnerability to side-channel attacks:   RSA algorithm is vulnerable to side-channel attacks, which means an attacker can use information leaked through side channels such as power consumption, electromagnetic radiation, and timing analysis to extract the private key.   Limited use in some applications:   RSA algorithm is not suitable for some applications, such as those that require constant encryption and decryption of large amounts of data, due to its slow processing speed.   Complexity:   The RSA algorithm is a sophisticated mathematical technique that some individuals may find challenging to comprehend and use.   Key Management:   The secure administration of the private key is necessary for the RSA algorithm, although in some cases this can be difficult.   Vulnerability to Quantum Computing:   Quantum computers have the ability to attack the RSA algorithm, potentially decrypting the data.>