def envoie_dernier_bloc(login, bloc):
	"""
	Fonction permettant d'envoyer un bloc (X[0...n]) pour vérification
	login : login de l'utilisateur
	bloc : bloc envoyé pour vérification (une chaîne de caractères, contenant des octets hexadécimaux)
	"""
	server = Server(BASE_URL)
	msg_a_envoyer = {'value' : bloc}
	print(server.query(TP2_URL + login + "/" + SEED_STR, msg_a_envoyer))	
	def demande_informations(self, message, IV):
		"""
		Méthode permettant d'envoyer une requête à l'oracle.
		Prend en paramètre un message chiffré (en hexadécimal).
		"""
		server = Server(self.base_url)
		#Le message à envoyer sera contenu dans le paramètre 'cyphertext'
		msg_a_envoyer = {'ciphertext' : message, 'IV' : IV}
		#print("Envoie de la requête à l'oracle...")
		return server.query(self.url + self.login, msg_a_envoyer)
def envoie_octet_intermediaire(login, i, byte):
	"""
	Fonction permettant d'envoyer un octet pour vérification, à la position i (en partant de la fin) d'un bloc X_n du message à déchiffrer
	login : login de l'utilisateur)
	i : position (en partant de la fin) de l'octet 'byte'
	byte : octet envoyé pour vérification (en hexadécimal)
	"""
	server = Server(BASE_URL)
	msg_a_envoyer = {'value' : byte}
	print(server.query(TP1_URL + login + "/" + SEED_STR + "/" + str(i), msg_a_envoyer))
def envoie_dernier_octet(login, last_byte):
	"""
	Fonction permettant d'envoyer le dernier octet trouvé du dernier bloc du message à déchiffrer
	login : login de l'utilisateur
	last_byte : l'octet trouvé (en hexadécimal)
	"""
	server = Server(BASE_URL)
	#Le message à envoyer sera contenu dans le paramètre 'cyphertext'
	msg_a_envoyer = {'value' : last_byte}
	print(server.query(TP1_URL + login + "/" + SEED_STR, msg_a_envoyer))
	Nécessite en paramètre le login de l'utilisateur
	"""

	#Login du user
	login = sys.argv[1]

	#Graine -> nombre aléatoire entier
	seed = randint(1, 1000)

	server = Server(BASE_URL)

	#Développement de l'URL pour CHALLENGE
	url_challenge = "{0}{1}/{2}".format(URL_CHALLENGE, login, seed)

	#Demande au serveur à l'URL de CHALLENGE
	reponse_challenge = server.query(url_challenge)

	#On récupère le champ A -> normalement en UTF-8, il faut décoder l'hexadécimal en bytes, puis de bytes en unicode
	AxorM = reponse_challenge['A']

	#On récupère le champ B -> normalement en ASCII, il faut décoder l'hexadécimal en bytes, puis de bytes en ascii
	BxorM = reponse_challenge['B']

	#Transformation en bytes pour A et B
	AxorM_decode = base64.b16decode(AxorM, casefold=True)
	BxorM_decode = base64.b16decode(BxorM, casefold=True)

	#Calcul du XOR entre A et B (en bytes) -> élimination du masque M
	AxorB = xor(AxorM_decode, BxorM_decode)

	length_AxorB = len(AxorB)
    Fonction permettant de s'assurer que a est premier avec q
    """
    x, _, _ = XGCD(a, b)
    return x

if __name__ == "__main__":

    #Récupération du login

    login = sys.argv[1]

    #Récupération des éléments

    client = Server(BASE_URL + TP_ACTUEL)

    reponse = client.query(GET_PK + login)

    p = reponse['p']

    q = (p - 1)

    g = reponse['g']

    h = reponse['h']

    #Choix de b et c de façon arbitraire - choix pouvant aller de 1 à q

    b = random.randint(1, q)

    tmp = 0
    """
    Fonction utilisée dans pollard_rho, afin de donner le nouveau résultat concernant x et y
    """
    return ((pow(x, 2) + 1) % n)

if __name__ == "__main__":

    login = sys.argv[1]

    level_spe = sys.argv[2]

    class_spe = sys.argv[3]

    server = Server(BASE_URL + TP_ACTUEL)

    reponse = server.query(GET_PARAM + level_spe + "/" + class_spe)

    id = reponse['id']

    n = reponse['n']

    print("n: {0}".format(n))

    fact_tab = []

    stack = [n]

    while len(stack) != 0:
        x = stack.pop(-1)
        if isprime(x):
            fact_tab.append(x)
    b = r
    tmp = (u[0] - q*v[0], u[1] - q*v[1])
    u = v
    v = tmp
  return a, u[0], u[1]

def modinv(a, b):
  g, x, y = XGCD(a,b)
  return x


if __name__ == "__main__" :
    print("Programme Elgamal Forgery ...")
    server = Server("http://pac.bouillaguet.info/TP4/ElGamal-forgery/")

    challenge = server.query("PK/verkyndt")

    p = challenge['p']
    g = challenge['g']
    h = challenge['h']

    q = p-1
    c = random.randrange(1,p-1)
    b = random.randrange(1,p-1)

    #c ne doit pas avoir de diviseur commun avec q autre que 1
    while(XGCD(c,q)[0]!=1):
        print("while")
        c = random.randrange(1,p-1)

    r = (pow(g,b,p) * pow(h,c,p)) % p
Esempio n. 9
0
	if ("-debug" in sys.argv):
		debug_mode = True
	else:
		debug_mode = False
		progressBar = ProgressBar.ProgressBar(100,100,"Progression...")

	#Implémentation du serveur
	server = Server(BASE_URL)

	#Récupération de la PK
	if (debug_mode):
		print("Récupération de la public key...")
	else:
		progressBar.update(20)

	PK = server.query(GET_PK + login)

	p = PK['p']
	g = PK['g']
	h = PK['h']
	q = p - 1

	m0 = random.randint(1, 100)
	m1 = random.randint(1, 100)

	#Récupération de m0
	mc0 = server.query(TO_SIGN + login, {'m' : m0})
	r, s0 = mc0['signature'][0], mc0['signature'][1]
	#Récupération de m1
	mc1 = server.query(TO_SIGN + login, {'m' : m1})
	_, s1 = mc1['signature'][0], mc1['signature'][1]
Esempio n. 10
0
	Main du programme rand
	"""
	login = sys.argv[1]

	if "-debug" in sys.argv:
		debug_mode = True
	else:
		debug_mode = False

	server = Server("http://pac.bouillaguet.info/TP3/rand/")

	rand_nbr = Random()

	inverse_modulaire = mod_inv(1103515245, 2**32)

	IV = server.query('/challenge/' + login)

	if debug_mode:
		print("IV[0] : {0}".format(IV["IV"][0]))
		print("IV[1] : {0}".format(IV["IV"][1]))

	#1er envoi
	k3_possibles = calculer_next(IV["IV"][0], IV["IV"][1])

	if debug_mode:
		print("Liste des k3 possibles: ", end = "")
		print("{0}".format(k3_possibles))

	#Liste des valeurs possibles pour la seed
	liste_des_possibles = []
Esempio n. 11
0
# -*- coding:utf-8 -*-

"""
TP5 PAC - signature de Rabin
"""

from rsa import *
from client import Server


NAME = 'monbailly'
URL = 'http://pac.bouillaguet.info/TP5/Rabin-signature/'

server = Server(URL)
rsa = RSA()
rsa.keyGen()

# ----------------------------------------------------------------------------
# Récupération du challenge
# -------------------------
dic = {'n': rsa.n}
response = server.query('challenge/' + NAME, dic)
print(response)
if __name__ == "__main__":
	"""
	Programme permettant de valider la partie 'ElGamal' du TP3 de PAC
	"""

	#Récupération du login de l'utilisateur
	login = sys.argv[1]

	progressBar = ProgressBar.ProgressBar(100,100,"Progression...")

	#Implémentation de l'URL
	server = Server(BASE_URL + TP_ACTUEL)

	#Récupération d'un dictionnaire contenant 'p' et 'q'
	#'p' est un nombre premier, tandis que 'q' est un générateur
	reponse_server = server.query(GET_PARAM + login)

	progressBar.update(20)

	p = reponse_server['p']
	g = reponse_server['g']

	#Génération d'un nombre aléatoire compris entre 1 et (p-1)
	x = random.randint(1, p-1)
	#Calcul de la clef publique en calculant g^x
	public_key = pow(g, x, p)

	challenge_a_envoyer = {'h' : public_key}

	reponse_server = server.query(GET_CHALLENGE + login, challenge_a_envoyer)