Я новичок в разработке в php и я студент, моя цель - разработать зашифрованный чат с сервером на одной стороне, который шифрует параметры отправки сообщений через сокет, и на стороне клиента, которая дешифрует сообщение значениями.
Я уже выполнил алгоритм шифрования RSA. html, но не могу получить значение сокета на стороне клиента RSAde c. html.
На клиенте со стороны мы отправляем поля n и d и зашифрованное сообщение для серверной стороны.
И я знаю, как записать их значения на их расшифрованной стороне на стороне клиента, но я не сделал этого в своем коде.
Я сделал клиент только с PHP clientvxx. php В противном случае, в виде чата, это 2-й шаг. Я также нашел способ общаться в JavaScript, он работает, но вы должны получить сообщение, кодирующее и декодирующее его, я не могу этого сделать.
Я использовал: socket_send () для отправки пакета socket_recv I невозможно получить
Примечание: у вас есть право менять языки программирования, например, на JAVA или даже на JAVASCRIPT / PHP;)
Вот мои коды: RSA Код детали передатчика:
"" "
import math
from random import choice
#calcul le pgcd entre les nombres premiers
def private_gcd(a, b):
while b != 0:
c = a % b
a = b
b = c
return a
#fonction Inverse modulaire : module inversé entre phi et l'argument m
def private_inversemodulaire(phi, m):
for x in range(1, m):
if (phi * x) % m == 1:
return x
return None
#de Javascript à Python
codageGroupSize = 0
codageTableChar = ""
# def private_tableComplete():
# #définit la table de conversion
codageTableChar = "0123456789 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&~#|*+-\\/=%!:?,.<>'àâçéèêëïîöôüûù" + '"'
TableConv = codageTableChar
tdesblocs=3
#fonction standard qui
# def private_standard(entree):
# alphabet= '0123456789'
# longueur = len(entree)
# entree_standard=''
# for i in range(0, longueur) :
# if (alphabet.indexOf(entree.[i!=-1]) :#charAt
# entree_standard += entree.[i] #charAt
# return entree_standard
#focntion permettant le calcul de d grâce à n et e, n étant généré par le couple (q,p) original
# calcul les différentes clefs nécessaires
# def calculClef() :
# p = 1511
# q = 907
# n = p * q
# N = float( n)
# euler = n - p - q + 1
# e = (e== "")
# tmpNe = 1
# d = 1
# while(((d * e) % euler) != 1):
# tmpNe += 1
# d = math.ceil( tmpNe * euler / e)
# # d = float(d) #sinon ne déchiffre pas
# #
# codageGroupSize = tdesblocs
# if (len(codageTableChar)*math.pow(100, codageGroupSize - 1) > n) :
# print("P ou Q risquent d'être trop petits pour un chiffrement valable !")
#utile pour récupérer les caractères
def private_valeurChar(lettre) :
return (codageTableChar.indexOf(lettre, 0))
# Calcul le modulo "Modulo" de "base" a la puissance "exposant" INDISPENSABLE
def private_moduloExpo(base, exposant, Modulo) :
moduloBase2 = []
# Niveau de puissance de 2 à considérer
#max et non math.max
moduloLevel = max(math.floor((math.log(exposant) / 0.6931471805599)), 1) #
# Préparation du tableau de transcodage
# moduloBase2[ 0] = base % Modulo #IndexError: list assignment index out of range
level = 1
for level in range(1,moduloLevel) :
# moduloBase2[ level] = ( moduloBase2[ level - 1] * moduloBase2[ level - 1]) % Modulo #IndexError: list assignment index out of range
# Utilisation pour décomposition en utilisant le tableau
expoDec = exposant
valeur = 1
level = moduloLevel
while (expoDec > 0) :
if (expoDec >= math.pow(2,level)) :
# valeur = (valeur * moduloBase2[ level]) % Modulo #IndexError: list assignment index out of range
level=level-1 #level-=1
expoDec -= math.pow(2, level)
else:
level=level-1
return valeur
#fonction pour chiffrer le bloc
def private_encodage(message, e, N) :
messageNum=""
# preSize = math.ceil(math.log(N) / math.log10(1)) # error division by zero
print('type de message est : ', type(message))
tailleGroupe = int(tdesblocs)
codageTableChar = TableConv
GroupeValue=0 #initiialiser sinon GroupeValue not declarec
k=0
for k in range(0,len(str(message))) :
# charAt message.charAt(k) transformer en str 'int' object is not subscriptable
# chiffre=private_valeurChar(message[k]) # PR commenter car error int is not subscriptable
chiffre='101010'
if(int(chiffre)<10) :
chiffre="0"+chiffre
messageNum+=chiffre
while(len(messageNum)%tailleGroupe>0):
messageNum="0"+messageNum
messageCode=""
k=0
for k in range(0,len(messageNum)) :
k=k+tailleGroupe
GroupeValue=int(messageNum.substring(k,k+tailleGroupe),10)
# chiffre le groupe
groupePreCode = private_moduloExpo(GroupeValue, e, N)
xx=str(groupePreCode)
while(len(xx)<preSize) :
groupePreCode="0"+groupePreCode
xx=str(groupePreCode)
messageCode += groupePreCode
messageCode += " "
return messageCode
#fonction pour déchiffer le bloc
def private_decodage(messageCode, d, N) :
continu=standard(messageCode)
tailleGroupe = tdesblocs
codageTableChar = TableConv
#PR error division by zero !!
# preSize = math.ceil(math.log(N) / math.log10(1))
nombre = ""
n=0
while(len(continu) > 0) :
groupeCode = int(continu.substring(0, preSize), 10)
continu = continu.substring(preSize, len(continu))
# déchiffre le groupe
groupelettre = private_moduloExpo(groupeCode, d, N)
if (n>0) :
xx=str(groupelettre)
while(len(xx)<tailleGroupe):
groupelettre="0"+groupelettre
xx=str(groupelettre)
n=n+1
nombre += groupelettre
message=""
k=0
for k in range(0,k<len(nombre), 2) :
lettre=int(nombre.substring(k,k+2),10)
message += codageTableChar+[lettre]
return message
#adaptation python javascript
#fonction pour générer les clés utilisées
def GENERATEUR_DE_CLE():
e=377
p=1511
q=907
n=p*q
phi = (p-1) * (q-1)#ajout de phi
print ('p=',p)
print('q=',q)
print ('phi=',phi)
euler = n - p - q + 1
tmpNe = 1
d = 1
while(((d * e) % euler) != 1):
tmpNe += 1
d = math.ceil( tmpNe * euler / e)
# d = float(d) #sert à rien
public_key = [e, n]
private_key = [d, n]
return [public_key, private_key]
#retour du python
def private_chiffre_block(m, e, n):
c = (m**e) % n
return c
def private_dechiffre_block(c, d, n):
m = (c**d) % n
return m
# méthode pour chiffrer le message
def chiffre_string(s, public_key):
e, n = public_key
return ''.join([chr(private_chiffre_block(ord(x), e, n)) for x in list(s)])
# méthode pour déchiffrer le message
def dechiffre_string(s, private_key):
d, n = private_key
return ''.join([chr(private_dechiffre_block(ord(x), d, n)) for x in list(s)])
" "" Мой передатчик и декодер RSA, которые я хочу использовать javascript в моем python или перенастроить его, чтобы использовать al go для шифрования и дешифрования моих сообщений: "" "
<!DOCTYPE html>
<html>
<body>
<div id="rsa_titre">
Chiffrement par RSA
</div>
Ici le couple <b>n,e</b> est la clé publique et <b>d</b> la clé privée .<br><br>
<b>Pour chiffrer:</b> Il suffit d'entrer <b>e</b>, <b>n</b> et la taille des blocs (c'est la
clef publique donnée par
la personne qui déchiffrera) ainsi que le message dans le champ "Message clair". Appuyez ensuite
sur "Chiffrer".<br><br>
<b>Pour déchiffrer:</b> Entrez, en plus de <b>e</b>, <b>n</b>
et la taille des blocs, la valeur de <b>d</b> (ou simplement entrez les trois
nombres originaux de p, q et e puis appuyez sur le bouton calcul). <br><br>
<b>Utilisation:</b> La personne voulant déchiffrer le message
doit posséder la clef privée, alors que les autres ne connaissent que les
clefs publiques.<br> Ici, les clefs privées sont <b>p</b>, <b>q</b>, <b>d</b>,
les clefs publiques sont <b>e</b> et <b>n</b>.
indique comment regrouper les chiffres avant le chiffrement proprement dit. <br><br>
<b>Création des clefs de (dé)chiffrement:</b> Entrez des nombres premiers dans les champs
p et q, puis e satisfaisant les conditions suivantes :<br> Il faut
que les 3 nombres soient différents et premiers.<br>
Que p et q soient sufisament grands .<br>
Et e premier avec (p-1).(q-1).<br> Appuyez ensuite sur le bouton "Calcul" pour trouver <b>n</b>
et <b>d</b>. Plus les nombres sont grands, plus de décryptement sera difficile, mais le temps de
déchiffrement augmentera aussi.<br><br>
<table border="0">
<tbody><tr>
<td>
<form method="POST" name="FormClef">
<table cellspacing="2" border="0">
<tbody><tr>
<td align="CENTER">p : <input type="TEXT" size="6" name="P" value="1511"></td>
<td align="CENTER">q : <input type="TEXT" size="6" name="Q" value="907"></td>
<td align="CENTER">e : <input type="TEXT" size="6" name="E" value="377"></td>
<td align="CENTER">Taille des blocs : <input type="TEXT" size="2" name="Groupage" value="3"></td>
</tr>
<tr>
<td align="CENTER"><input type="BUTTON" value="Calculs" onclick="CalculClef()"></td>
<td colspan="2" align="CENTER">n = p·q : <input type="TEXT" size="12" name="N"></td>
<td align="CENTER">d : <input type="TEXT" size="12" name="D"></td>
</tr>
<tr>
<td></td>
<td colspan="4" align="CENTER">
<input type="BUTTON" name="Table1" value="Table de conversion simple" onclick="TableConv.value=' ABCDEFGHIJKLMNOPQRSTUVWXYZ'">
<input type="BUTTON" name="Table2" value="Table de conversion étendue" onclick="tableComplete()">
</td>
</tr>
<tr>
<td>Table de conversion</td>
<td colspan="4">
<input type="TEXT" size="70" name="TableConv"><br>
</td>
</tr>
</tbody></table>
</form>
<form method="POST" name="FormCodage">
<table>
<tbody><tr>
<td >Message clair<br>
<br>
<td colspan="4" >
<textarea name="Texte" rows="6" cols="70" wrap="HARD">texte clair</textarea>
</td>
</tr>
<tr>
<td></td>
<td colspan="4" align="CENTER">
<table width="80%" cellspacing="1" cellpadding="1" border="0">
<tbody><tr>
<td>
<input type="BUTTON" name="Code" value="Chiffrer" onclick="Encode()">
</td>
<td>
<input type="BUTTON" name="Decode" value="Déchiffrer" onclick="Decoder()">
</td>
<td>
<input type="BUTTON" value="Effacer" onclick="FormCodage.Texte.value=''; FormCodage.Crypte.value=''" name="BUTTON">
</td>
</tr>
</tbody></table>
</td>
</tr>
<tr>
<td>Message chiffré<br>
<br>
<td colspan="4">
<textarea name="Crypte" rows="6" cols="70" wrap="SOFT"></textarea>
</td>
</tr>
</tbody></table>
</form>
</td></tr></tbody></table>
<script>
var CodageGroupSize = 0;
CodageTableChar = "0123456789 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&~#|*+-\\/=%!:;?,.<>'àâçéèêëïîöôüûù" + '"';
FormClef.TableConv.value = CodageTableChar;
function standard(entree)
{
alphabet= '0123456789';
longueur = entree.length;
entree_standard='';
for (i=0; i<longueur; i++)
{
if (alphabet.indexOf(entree.charAt(i))!=-1)
{
entree_standard += entree.charAt(i)
}
}
// document.write('lentreestandardest' + entree_standard);
// console.log('lentreestandardest' + entree_standard);
return entree_standard;
}
function CalculClef()
{
p = (FormClef.P.value == "") ? 0 : FormClef.P.value;
q = (FormClef.Q.value == "") ? 0 : FormClef.Q.value;
n = p * q;
FormClef.N.value = parseFloat( n);
Euler = n - p - q + 1;
// Recherche au coup par coup
e = (FormClef.E.value == "") ? 0 : FormClef.E.value;
TmpNe = 1;
d = 1;
while
(((d * e) % Euler) != 1)
{
TmpNe += 1;
d = Math.ceil( TmpNe * Euler / e);
};
FormClef.D.value = parseFloat(d);
CodageGroupSize = FormClef.Groupage.value;
if (CodageTableChar.length*Math.pow(100, CodageGroupSize - 1) > n)
{
alert("P ou Q risquent d'être trop petits !");
};
}
function ValeurChar(Lettre){
return (CodageTableChar.indexOf(Lettre, 0));
};
function ModuloDexpo(Base, Exposant, Modulo) {
var ModuloBase2 = new Array();
ModuloLevel = Math.max(Math.floor((Math.log(Exposant) / 0.6931471805599)), 1);
ModuloBase2[ 0] = Base % Modulo;
console.log('ModuloBase2:',ModuloBase2[0])
for
( Level = 1; Level <= ModuloLevel; Level++)
{
ModuloBase2[ Level] = ( ModuloBase2[ Level - 1] * ModuloBase2[ Level - 1]) % Modulo;
};
ExpoDec = Exposant;
Valeur = 1;
Level = ModuloLevel;
while
(ExpoDec > 0)
{
if
(ExpoDec >= Math.pow(2, Level))
{
Valeur = (Valeur * ModuloBase2[ Level]) % Modulo;
ExpoDec -= Math.pow(2, Level--);
}
else
{
Level--
};
}
return Valeur
};
function Encodage(Message, E, N)
{
messageNum="";
PreSize = Math.ceil(Math.log(N) / Math.LN10);
TailleGroupe = parseInt(FormClef.Groupage.value)
CodageTableChar = FormClef.TableConv.value;
for(k=0; k<Message.length; k++) {
chiffre=ValeurChar(Message.charAt(k))
// document.write('chiffre='+chiffre);
if(parseInt(chiffre)<10) {chiffre="0"+chiffre};
messageNum+=chiffre
}
while(messageNum.length%TailleGroupe>0){messageNum="0"+messageNum}
MessageCode="";
// console.log('1erGroupeValue', GroupeValue);//groupevalue not defined
for(k=0; k<messageNum.length; k=k+TailleGroupe) {
GroupeValue=parseInt(messageNum.substring(k,k+TailleGroupe),10)
// document.write('2emeGroupeValue', GroupeValue);
// chiffre le groupe
GroupePreCode = ModuloDexpo(GroupeValue, E, N);
xx=GroupePreCode.toString()
while(xx.length<PreSize) {GroupePreCode="0"+GroupePreCode;xx=GroupePreCode.toString()}
MessageCode += GroupePreCode
MessageCode += " "
};
return MessageCode;
};
function Decodage(MessageCode, D, E, N)
{
continu=standard(MessageCode)
TailleGroupe = FormClef.Groupage.value;
CodageTableChar = FormClef.TableConv.value;
PreSize = Math.ceil(Math.log(N) / Math.LN10);
nombre = "";
n=0;
while(continu.length > 0)
{
GroupeCode = parseInt(continu.substring(0, PreSize), 10);
continu = continu.substring(PreSize, continu.length); //peutetre commenté
// déchiffre le groupe
GroupeLettre = ModuloDexpo(GroupeCode, D, N);
if (n>0) {
xx=GroupeLettre.toString()
while(xx.length<TailleGroupe){
GroupeLettre="0"+GroupeLettre;
xx=GroupeLettre.toString()
}
}
n++
nombre += GroupeLettre;
}
Message="";
for(k=0; k<nombre.length; k=k+2) {
lettre=parseInt(nombre.substring(k,k+2),10)
Message += CodageTableChar.charAt(lettre)
};
return Message;
};
function Encode(){
FormCodage.Crypte.value = Encodage( FormCodage.Texte.value, FormClef.E.value, FormClef.N.value);
};
function Decoder(){
FormCodage.Texte.value = Decodage( FormCodage.Crypte.value, FormClef.D.value, FormClef.E.value, FormClef.N.value);
};
</script>
</html>
" "" Мой клиент 1: "" "
from socket import *
from threading import Thread
import sys,tkinter, time
import RSA
def recevoir():
#Reçoit les messages.
message_list.insert(tkinter.END, "Bonjour! %s" % NOM)
message_list.insert(tkinter.END, " Vous êtes en ligne!")
while True:
try:
message = CLIENT.recv(BUFFER_SIZE).decode("utf8")
print('message non décodé',message)
message = RSA.dechiffre_string(message, private_key_1)
print('message décodé: ', message)
print ('voici la clé privé du client 1', private_key_1)
message_list.insert(tkinter.END, message)
except OSError: # Si l'utilisateur se déconnecte
print('OSERROR')
break
def send(event = None): # évènement passé par le binders.
#Pour send des messages.
message = my_message.get()
my_message.set("") # Vide le champ de saisie
message = NOM + ": " + message
message_list.insert(tkinter.END, message)
message = RSA.chiffre_string(message, public_key_2)
CLIENT.send(bytes(message, "utf8"))
def fermeture(event = None):
#Quand on clique fermer la fenêtre
message_list.insert(tkinter.END, "déconnexion...")
time.sleep(2)
CLIENT.close()
top.quit()
sys.exit()
#****INTERFACE GRAPHIQUE tkinter****
top = tkinter.Tk()
top.title("Projet tutoré S4 client1")
messages_frame = tkinter.Frame(top)
my_message = tkinter.StringVar() # Pour les messages à être send.
my_message.set("Saissisez votre message...")
scrollbar = tkinter.Scrollbar(messages_frame) # Pour naviguer entre les messages.
# Conteneur du message
message_list = tkinter.Listbox(messages_frame, height=25, width=100, yscrollcommand=scrollbar.set)
scrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
message_list.pack(side=tkinter.LEFT, fill=tkinter.BOTH)
message_list.pack()
messages_frame.pack()
entry_field = tkinter.Entry(top, textvariable=my_message)
entry_field.bind("<Return>", send)
entry_field.pack()
send_button = tkinter.Button(top, text = "Envoyer", command = send)
send_button.pack()
top.protocol("WM_DELETE_WINDOW", fermeture)
#****Partie SOCKET****
#IP = input('IP: ')
#PORT = int(input('port: '))
#NOM = input(NOM: ')
IP = "192.168.56.1"
PORT = 42000
NOM= "ALICE au pays des bisounours"
BUFFER_SIZE = 1024
ADRESSE = (IP, PORT)
CLIENT = socket(AF_INET, SOCK_STREAM) # client socket object
CLIENT.connect(ADRESSE) # Pour se connecter au socket du serveur socket grâce à l'adresse
public_key_1, private_key_1 = RSA.GENERATEUR_DE_CLE()
print("Cle privée personnelle client1", private_key_1)
message = str(public_key_1[0]) + '*' + str(public_key_1[1])
print("Clé publique personnelle (à send)", public_key_1)
CLIENT.send(bytes(message, "utf8"))
m = CLIENT.recv(BUFFER_SIZE).decode('utf8')
public_key_2 = [int(x) for x in m.split('*')]
print("Cle publique reçue", public_key_2)
recevoir_thread = Thread(target = recevoir) # Thread créée pour pouvoir recevoir simultanément avec cette méthode
recevoir_thread.start()
tkinter.mainloop() # Démarre l'interface graphique Tkinter.
" "" Мой клиент 2: " ""
from socket import *
from threading import Thread
import tkinter, sys, time
import RSA
def recevoir():
#Reçoit les messages.
message_list.insert(tkinter.END, "Bonjour! %s" % NOM)
message_list.insert(tkinter.END, " Vous êtes en ligne!")
while True:
try:
message = CLIENT.recv(BUFFER_SIZE).decode("utf8")
print("decrypte message", message, " avec ma cle privee", private_key_2)
message = original_RSA.decrypt_string(message, private_key_2)
print("le message decrypte est", message)
message_list.insert(tkinter.END, message)
except OSError: # Si l'utilisateur se déconnecte
print('OSERROR')
break
def send(event = None): # évènement passé par le binders.
#Pour send des messages.
message = my_message.get()
my_message.set("") # Vide le champ de saisie
message = NOM + ": " + message
message_list.insert(tkinter.END, message)
print("chiffre le message", message, " avec la cle publique de l'autre", public_key_1)
message = original_RSA.chiffre_string(message, public_key_1)
print("le message cryptee est ", message)
CLIENT.send(bytes(message, "utf8"))
def fermeture(event = None):
#Quand on clique fermer la fenêtre
message_list.insert(tkinter.END, "déconnexion...")
time.sleep(2)
CLIENT.close()
top.quit()
sys.exit()
#----INTERFACE GRAPHIQUE tkinter GUI----
top = tkinter.Tk()
top.title("Projet tutoré S4 client2")
messages_frame = tkinter.Frame(top)
my_message = tkinter.StringVar() # Pour les messages à être send.
my_message.set("Saissisez votre message...")
scrollbar = tkinter.Scrollbar(messages_frame) # Pour naviguer entre les messages.
# Conteneur du message
message_list = tkinter.Listbox(messages_frame, height=25, width=100, yscrollcommand=scrollbar.set)
scrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
message_list.pack(side=tkinter.LEFT, fill=tkinter.BOTH)
message_list.pack()
messages_frame.pack()
entry_field = tkinter.Entry(top, textvariable=my_message)
entry_field.bind("<Return>", send)
entry_field.pack()
send_button = tkinter.Button(top, text = "Envoyer", command = send)
send_button.pack()
top.protocol("WM_DELETE_WINDOW", fermeture)
#****Partie SOCKET****
#IP = input('IP: ')
#PORT = int(input('port: '))
#NOM = input(NOM: ')
HOST = "192.168.56.1"
PORT = 42000
NOM= "Bob"
BUFFER_SIZE = 1024
ADRESSE = (HOST, PORT)
CLIENT = socket(AF_INET, SOCK_STREAM) # client socket object
CLIENT.connect(ADRESSE) # Pour se connecter au socket du serveur socket grâce à l'adresse
public_key_2, private_key_2 = RSA.GENERATEUR_DE_CLE()
print("Cle privée personnelle client2", private_key_2)
message = str(public_key_2[0]) + '*' + str(public_key_2[1])
print("Cle publique personnelle (à send)", public_key_2)
CLIENT.send(bytes(message, "utf8"))
m = CLIENT.recv(BUFFER_SIZE).decode('utf8')
public_key_1 = [int(x) for x in m.split('*')]
print("cle publique recue", public_key_1)
recevoir_thread = Thread(target = recevoir) # Thread créée pour pouvoir recevoir simultanément avec cette méthode
recevoir_thread.start()
tkinter.mainloop()
"" "Мой сервер:" ""
#Pour lancer le serveur qui fait transiter les messsages
from socket import *
from threading import Thread
client_sock = [] # stcoke les sockets client
client_addresses = {} # stocke les adresses {key: client socket, values: client address}
public_key = [] # stocke les clés publiques des clients
def communication_entrante_acceptée():
#ACCAPETE les communications entrantes et les maintient pour les clients
client, client_address = SERVER.accept()
client_sock.append(client)
print("%s:%s has connected." % client_address)
public_key.append(client.recv(BUFFER_SIZE))
client_addresses[client] = client_address
def conteneur_client1(client_sock, client_addresses):
#Contient le premier client (connexion)
client_sock[0].send(public_key[1])
while True:
msg0 = client_sock[0].recv(BUFFER_SIZE)
client_sock[1].send(msg0)
print(" Client 1: %s" % msg0.decode('utf8'))
def conteneur_client2(client_sock, client_addresses):
#Contient le deuxième client (connexion)
client_sock[1].send(public_key[0])
while True:
msg1 = client_sock[1].recv(BUFFER_SIZE)
client_sock[0].send(msg1)
print(" Client 2: %s" % msg1.decode('utf8'))
#****Partie SOCKET****
IP = gethostbyname(gethostname()) # récupère l'adresse IP
PORT = 42000
BUFFER_SIZE = 1024 # taille en mémoire tampon du récepteur
ADDRESSE = (IP, PORT) # servers socket address
SERVER = socket(AF_INET, SOCK_STREAM) # create socket object
SERVER.bind(ADDRESSE) # Association de l'IP du socket et le numéro du port.
SERVER.listen(2)
print('IP du serveur: ', IP)
print('Port du serveur: ', PORT)
print("En attente de connexion...")
communication_entrante_acceptée()
communication_entrante_acceptée()
Thread(target = conteneur_client1, args = (client_sock, client_addresses)).start()
Thread(target = conteneur_client2, args = (client_sock, client_addresses)).start()
print('Conversation chiffré: ')
SERVER.close()
"" "
ОРИГИНАЛЬНЫЕ РАБОЧИЕ КОДЫ: original_rsa.py:" "" import original_premier из случайного выбора импорта def private_gcd (a, b): в то время как b! = 0: c = a% ba = bb = c вернуть def private_inversemodulaire (phi, m): для x в диапазоне (1, m ): if (phi * x)% m == 1: r eturn x return None def private_nbprementreux (phi): l = [] для x в диапазоне (2, phi): если private_gcd (phi, x) == 1 и private_inversemodulaire (x, phi)! = Нет: l.append (x) ) если len (l)> 5: разбить x на l: if x == private_inversemodulaire (x, phi): l.remove (x) вернуть l
def GENERATEUR_DE_CLE():
p, q = original_premier.nombre_different_premier()
n = p * q
phi = (p-1) * (q-1) # Fonction eulérienne (totient)
print ('p=',p)
print('q=',q)
print ('phi=',phi)
e = choice(private_nbprementreux(phi))
d = private_inversemodulaire(e, phi)
public_key = [e, n]
private_key = [d, n]
return [public_key, private_key]
def private_chiffre_block(m, e, n):
c = (m**e) % n
return c
def private_dechiffre_block(c, d, n):
m = (c**d) % n
return m
# méthode pour chiffrer le message
def chiffre_string(s, public_key):
e, n = public_key
return ''.join([chr(private_chiffre_block(ord(x), e, n)) for x in list(s)])
def dechiffre_string(s, private_key):
d, n = private_key
return ''.join([chr(private_dechiffre_block(ord(x), d, n)) for x in list(s)])
"" "original_premier.py: "" "
from random import choice
premier = [967, 971, 977, 983, 991, 997]
def nombre_different_premier():
while True:
p = choice(premier)
q = choice(premier)
if p != q:
return [p, q]
" ""
Спасибо за все и за чтение и ответы!