


Utiliser Python pour implémenter le chiffrement et le déchiffrement RSA
J'ai vu hier un article en anglais [1], montrant comment utiliser Python pour implémenter l'algorithme RSA. La logique du code est la même que celle de l'article précédent Comprendre l'algorithme RSA. Les amis qui ne sont pas familiers avec RSA peuvent lire l'article. Comprendre l'algorithme RSA, qui explique ce qu'est RSA, les principes mathématiques de RSA, et donne un exemple simple. On peut dire que c'est l'article le plus simple pour comprendre RSA sur Quanzhihu (cela vient des commentaires des lecteurs).
J'ai exécuté le code fourni en anglais et j'ai découvert qu'il ne pouvait pas crypter le chinois. J'ai donc modifié les fonctions de cryptage et de décryptage pour prendre en charge le cryptage et le décryptage du chinois. L'article d'aujourd'hui explique comment utiliser Python pour implémenter le processus de cryptage et de déchiffrement RSA afin de vous aider à établir une compréhension intuitive de RSA. L'algorithme de génération de nombres premiers aléatoires dans le code mérite également d'être appris.
0. Démonstration de l'effet
Jetons d'abord un coup d'œil à l'effet.
Texte original : "Il y a une taupe, mettez fin à la transaction"
Le texte chiffré ne peut pas être déchiffré du tout :
Après le décryptage :
Code complet du compte public "Python Seven" a répondu "rsa" Get.
1. Génération de paires de clés
Idées :
1) Trouvez au hasard deux nombres premiers (nombres premiers) p et q Plus p et q sont grands, plus ils sont sûrs. Ici, nous choisissons un nombre premier de 1024 bits :
p = genprime(1024) q = genprime(1024)
genprime( ) Ne parlons pas du processus d'implémentation de la fonction.
2) Calculez leur produit n = p * q et la fonction d'Euler lambda_n.
n = p * q lambda_n = (p - 1) * (q - 1)
3) Sélectionnez au hasard un entier e, à condition que 1
e = 35537
4) Trouvez un entier d tel que le reste de e * d divisé par lambda_n soit 1, et renvoyez la paire de clés.
d = eucalg(e, lambda_n)[0] if d < 0: d += lambda_n return (d, n), (e, n)
eucalg L'implémentation de la fonction sera discutée plus tard.
À ce stade, la fonction de génération de paire de clés est la suivante :
def create_keys(): p = genprime(1024) q = genprime(1024) n = p * q lambda_n = (p - 1) * (q - 1) e = 35537 d = eucalg(e, lambda_n)[0] if d < 0: d += lambda_n return (d, n), (e, n)
2. Mise en œuvre du cryptage et du déchiffrement
Le processus de cryptage et de déchiffrement est le même, cryptage à clé publique, déchiffrement à clé privée, et vice versa, privé. cryptage par clé, déchiffrement par clé publique, mais le premier est appelé cryptage et le second est appelé signature.
L'implémentation spécifique de la fonction est la suivante :
def encrypt_data(data,key): e_data = [] for d in data: e = modpow(d, key[0], key[1]) e_data.append(e) return e_data ## 加密和解密的逻辑完全一样 decrypt_data = encrypt_data
La fonction modpow est utilisée ici, qui est utilisée pour calculer la formule b^e % n = r.
- S'il s'agit d'un processus de cryptage, alors b est le texte en clair, (n,e) est la clé publique et r est le texte chiffré.
- S'il s'agit d'un processus de décryptage, alors b est le texte chiffré, (n, d) est la clé privée et r est le fameux texte.
modpow est défini comme suit :
def modpow(b, e, n): # find length of e in bits tst = 1 siz = 0 while e >= tst: tst <<= 1 siz += 1 siz -= 1 # calculate the result r = 1 for i in range(siz, -1, -1): r = (r * r) % n if (e >> i) & 1: r = (r * b) % n return r
3. Fonction de génération de nombres premiers aléatoires
Fonction de génération de nombres premiers aléatoires, qui utilise la multiplication matricielle et la séquence de Fibonacci, qui montre l'importance des mathématiques pour les algorithmes.
# matrix multiplication def sqmatrixmul(m1, m2, w, mod): mr = [[0 for j in range(w)] for i in range(w)] for i in range(w): for j in range(w): for k in range(w): mr[i][j] = (mr[i][j] + m1[i][k] * m2[k][j]) % mod return mr # fibonacci calculator def fib(x, mod): if x < 3: return 1 x -= 2 # find length of e in bits tst = 1 siz = 0 while x >= tst: tst <<= 1 siz += 1 siz -= 1 # calculate the matrix fm = [ # function matrix [0, 1], [1, 1] ] rm = [ # result matrix # (identity) [1, 0], [0, 1] ] for i in range(siz, -1, -1): rm = sqmatrixmul(rm, rm, 2, mod) if (x >> i) & 1: rm = sqmatrixmul(rm, fm, 2, mod) # second row of resulting vector is result return (rm[1][0] + rm[1][1]) % mod def genprime(siz): while True: num = (1 << (siz - 1)) + secrets.randbits(siz - 1) - 10; # num must be 3 or 7 (mod 10) num -= num % 10 num += 3 # 3 (mod 10) # heuristic test if modpow(2, num - 1, num) == 1 and fib(num + 1, num) == 0: return num num += 5 # 7 (mod 10) # heuristic test if modpow(2, num - 1, num) == 1 and fib(num + 1, num) == 0: return num
4. Implémentation de la fonction eucalg
L'essence de la fonction est de trouver la solution de l'équation linéaire suivante à deux variables :
e * x - lambda_n * y =1
Code spécifique :
def eucalg(a, b): # make a the bigger one and b the lesser one swapped = False if a < b: a, b = b, a swapped = True # ca and cb store current a and b in form of # coefficients with initial a and b # a' = ca[0] * a + ca[1] * b # b' = cb[0] * a + cb[1] * b ca = (1, 0) cb = (0, 1) while b != 0: # k denotes how many times number b # can be substracted from a k = a // b # swap a and b so b is always the lesser one a, b, ca, cb = b, a-b*k, cb, (ca[0]-k*cb[0], ca[1]-k*cb[1]) if swapped: return (ca[1], ca[0]) else: return ca
5. :
1), Générez la clé
python test.py make-keys rsakey
La clé publique est stockée dans rsakey.pub et la clé privée est stockée dans rsakey.priv
2), cryptez le contenu du fichier
S'il y a un fichier en texte brut .txt :
python test.py encrypt 明文.txt from rsakey to 密文.txt
générera le texte chiffré .txt
3. Décrypter le contenu du fichier
S'il existe un fichier ciphertext.txt :
python test.py decrypt 密文.txt as rsakey to 解密后.txt
générera le .txt déchiffré
Mots finaux
Cet article partage un simple implémentation de l'algorithme RSA en Python, qui peut aider à comprendre l'algorithme RSA.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Python et C ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1) Python convient au développement rapide et au traitement des données en raison de sa syntaxe concise et de son typage dynamique. 2) C convient à des performances élevées et à une programmation système en raison de son typage statique et de sa gestion de la mémoire manuelle.

Le choix de Python ou C dépend des exigences du projet: 1) Si vous avez besoin de développement rapide, de traitement des données et de conception du prototype, choisissez Python; 2) Si vous avez besoin de performances élevées, de faible latence et de contrôle matériel, choisissez C.

En investissant 2 heures d'apprentissage Python chaque jour, vous pouvez améliorer efficacement vos compétences en programmation. 1. Apprenez de nouvelles connaissances: lire des documents ou regarder des tutoriels. 2. Pratique: Écrivez du code et complétez les exercices. 3. Revue: consolider le contenu que vous avez appris. 4. Pratique du projet: Appliquez ce que vous avez appris dans les projets réels. Un tel plan d'apprentissage structuré peut vous aider à maîtriser systématiquement Python et à atteindre des objectifs de carrière.

Les méthodes pour apprendre Python efficacement dans les deux heures incluent: 1. Passez en revue les connaissances de base et assurez-vous que vous connaissez l'installation de Python et la syntaxe de base; 2. Comprendre les concepts de base de Python, tels que les variables, les listes, les fonctions, etc.; 3. Master Basic et Advanced Utilisation en utilisant des exemples; 4. Apprenez des erreurs courantes et des techniques de débogage; 5. Appliquer l'optimisation des performances et les meilleures pratiques, telles que l'utilisation des compréhensions de la liste et le suivi du guide de style PEP8.

Python convient aux débutants et à la science des données, et C convient à la programmation système et au développement de jeux. 1. Python est simple et facile à utiliser, adapté à la science des données et au développement Web. 2.C fournit des performances et un contrôle élevés, adaptés au développement de jeux et à la programmation système. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Python est plus adapté à la science des données et au développement rapide, tandis que C est plus adapté aux performances élevées et à la programmation système. 1. La syntaxe Python est concise et facile à apprendre, adaptée au traitement des données et à l'informatique scientifique. 2.C a une syntaxe complexe mais d'excellentes performances et est souvent utilisée dans le développement de jeux et la programmation système.

Il est possible d'investir deux heures par jour pour apprendre Python. 1. Apprenez de nouvelles connaissances: apprenez de nouveaux concepts en une heure, comme les listes et les dictionnaires. 2. Pratique et pratique: utilisez une heure pour effectuer des exercices de programmation, tels que la rédaction de petits programmes. Grâce à une planification et à une persévérance raisonnables, vous pouvez maîtriser les concepts de base de Python en peu de temps.

Python est plus facile à apprendre et à utiliser, tandis que C est plus puissant mais complexe. 1. La syntaxe Python est concise et adaptée aux débutants. Le typage dynamique et la gestion automatique de la mémoire le rendent facile à utiliser, mais peuvent entraîner des erreurs d'exécution. 2.C fournit des fonctionnalités de contrôle de bas niveau et avancées, adaptées aux applications haute performance, mais a un seuil d'apprentissage élevé et nécessite une gestion manuelle de la mémoire et de la sécurité.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

MantisBT
Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

Version crackée d'EditPlus en chinois
Petite taille, coloration syntaxique, ne prend pas en charge la fonction d'invite de code

ZendStudio 13.5.1 Mac
Puissant environnement de développement intégré PHP

Navigateur d'examen sécurisé
Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)