Skip to content
Snippets Groups Projects
Commit 4bc3cd42 authored by Julia Sauvage's avatar Julia Sauvage
Browse files

checkpoint

parent 3816daa6
No related branches found
No related tags found
No related merge requests found
......@@ -2,6 +2,7 @@ import time
import random as r
import fpylll as f
import os
from itertools import product
k = 64
known_up = 6
......@@ -17,6 +18,17 @@ for i in range (1, nboutput):
polA.append((polA[i-1] + powA [i-1]) % 2^128)
powA.append((powA[i-1] * a)% 2^128)
def dec2bin(d,nb= 2 * k - known_low + 1):
"""Représentation d'un nombre entier en chaine binaire (nb: nombre de bits du mot)"""
if d == 0:
return "0".zfill(nb)
if d<0:
d += 1<<nb
b=""
while d != 0:
d, r = divmod(d, 2)
b = "01"[r] + b
return b.zfill(nb)
#### MATRIX ####
def getG(n,mod):
......@@ -37,8 +49,8 @@ def getG(n,mod):
def getGreduite(n,mod):
G = getG(n,mod)
Gr = G.transpose().LLL()
Glll = f.IntegerMatrix.from_matrix(Gr)
return Glll
#Glll = f.IntegerMatrix.from_matrix(Gr)
return Gr
Greduite1 = getGreduite(nbiter - 1, 2^k)
......@@ -46,15 +58,15 @@ Greduite2 = getGreduite(nboutput - 1, 2^(2 * k - known_low))
print("Vecteur réputé court de taille : 2^{:.1f}".format(float(log(Greduite2[0].norm(), 2).n())))
#### Récupération des données ####
'''def recupDonnees():
listfiles = os.listdir('results')
print(listfiles)
listDonnees = []
for i in range(listfiles):
listDonnees.append[]
f = open(listfiles[i], "r")
while(1):
s = f.readline()'''
#def recupDonnees():
# listfiles = os.listdir('results')
# print(listfiles)
# listDonnees = []
# for i in range(listfiles):
# listDonnees.append[]
# f = open(listfiles[i], "r")
# while(1):
# s = f.readline()
......@@ -108,7 +120,8 @@ def FindDS64(uX, rot, W0,WC, Greduite): #rajouter rot dans la version non test ?
Y = getY(W0, WC, rot, uX)
DY = getDY(Y, WC, W0) #OK avec erreurs de retenues!
tmp = vector([y * 1<<(k - known_up - known_low) for y in DY])#on rajoute les zéros, recentrage impossible à cause des erreurs de retenues
DS64 = f.CVP.closest_vector(Greduite,tuple(tmp))
G = f.IntegerMatrix.from_matrix(Greduite)
DS64 = f.CVP.closest_vector(G,tuple(tmp))
return DS64, Y[0]
######FINDROTI######
......@@ -138,36 +151,51 @@ def FindRot(DS640,X, Y0, W0, WC): #OK !
return []
return tabrot
def findDS(rot, Greduite, cheat_DS): #OK!
def findDS(rot, Greduite, cheat_DS, DS64): #OK!
rotprim = []
for i in range(nboutput):
rotprim.append((((rot[i] << 122) - (powA[i] * W0 + polA[i] * WC)) >> known_low) % (1 << (128 - known_low)))
rotprim.append((rot[i] - ((powA[i] * W0 + polA[i] * WC) >> (2 * k - known_up))) % (1<<known_up))
tmp = vector([(rotprim[i+1] - rotprim[i]) << (2 * k - known_up - known_low) for i in range(nboutput - 1)])
# approximation de cheat_DS
tmp = vector([(rotprim[i+1] - rotprim[i]) for i in range(nboutput - 1)])
# distance entre approx et vraie solution
norm = sqrt(sum([(tmp[i] - cheat_DS[i])**2 for i in range(nboutput - 1)]))
print("distance : 2^{:.1f}".format(float(log(norm, 2).n())))
'''print("cheat_DS et tmp :")
for i in range(nboutput - 1):
print(dec2bin(cheat_DS[i]))
print(dec2bin(tmp[i]))
print((cheat_DS[i] - tmp[i])>>(2 * k - known_up - known_low))'''
return f.CVP.closest_vector(Greduite,tuple(tmp))
G = f.IntegerMatrix.from_matrix(Greduite)
return f.CVP.closest_vector(G,tuple(tmp))
'''cvp = f.CVP.closest_vector(G,tuple(shifted_tmp))
return vector([((cvp[i] << k) + DS64[0] * powA[i]) % (1 << (128 - known_low)) for i in range(nboutput-1)])'''
def findDSdebug(rot, Greduite, cheat_S, DS64): #OK!
rotprim = []
for i in range(nboutput):
rotprim.append((rot[i] - ((powA[i] * W0 + polA[i] * WC) >> (2 * k - known_up))) % (1<<known_up))
Y = [((S[i] - (powA[i] * W0 + polA[i] * WC)) >> known_low) % (1 << (2*k - known_low)) for i in range(nboutput)]
#print("rotprim<< et Y+")
rotprim[1] = (rotprim[1] - 1) % k
#print("ATTENTION UN ZERO !!!")
#print(dec2bin(Y[1]))
#for i in range(nboutput - 1):
# print(dec2bin(rotprim[i] << (2 * k - known_up - known_low)))
# print(dec2bin(Y[i]))
# print('')
cheat_DS = [(Y[i + 1] - Y[i]) % (1 << (2*k - known_low)) for i in range(nboutput - 1)]
tmp = vector([(rotprim[i+1] - rotprim[i]) << (2 * k - known_up - known_low) for i in range(nboutput - 1)])
def recFindDS(rot, tabrot, Greduite, i, cheat_DS):
DS = []
if(i == nboutput):
DS = [findDS(rot, Greduite, cheat_DS)]
return(DS)
for r in tabrot[i]:
rot.append(r)
DS += recFindDS(copy(rot), tabrot, Greduite, i+1, cheat_DS)
return(DS)
#print("cheat_DS et tmp :")
#for i in range(nboutput - 1):
# print(dec2bin(cheat_DS[i]))
# print(dec2bin(tmp[i]))
# print((cheat_DS[i] - tmp[i])>>(2 * k - known_up - known_low))
G = f.IntegerMatrix.from_matrix(Greduite)
return f.CVP.closest_vector(G,tuple(tmp))
cpt = 0
cptrotfail = 0
n = 1000
n = 10000
#recupDonnees()
for blabla in range(n):
X, S, c = sortiesGenerateur()
......@@ -184,13 +212,25 @@ for blabla in range(n):
uX = unrotateX(X,rot)
DS64, Y0 = FindDS64(uX, rot, W0,WC, Greduite1)#OK!
assert cheat_DS[0] % (1 << 64) == DS64[0]
tabrot = FindRot(DS64[0],X, Y0, W0, WC)#a l'air OK!
test = 0
if(len(tabrot) == 0):
cptrotfail += 1
else:
rot = []
listDS = recFindDS(rot, tabrot, Greduite2, 0, cheat_DS)
listrot = list(product(*tabrot))
#for rot in listrot:
# for i in range(len(S)):
# print((S[i] >> (2 * k - 6)) - rot[i])
listDS = [findDS(rot, Greduite2, S, DS64) for rot in listrot]
for DS in listDS:
Sprim = [(S[i] - polA[i] * (c % 1<<known_low) - powA[i] * (S[0] % 2^known_low)) % 2^128 for i in range(nboutput)]
if(DS[0] == ((Sprim[1] - Sprim[0]) >> known_low)):
test = 1
#if blabla < 3 :
# print('############### NOUVEAU SAMPLE #################')
# listDS = [findDSdebug(rot, Greduite2, S, DS64) for rot in listrot]
if not test :
print('############### NOUVEAU CAS QUI MARCHE PAS #################')
listDS = [findDSdebug(rot, Greduite2, S, DS64) for rot in listrot]
for DS in listDS:
Sprim = [(S[i] - polA[i] * (c % 1<<known_low) - powA[i] * (S[0] % 2^known_low)) % 2^128 for i in range(nboutput)]
if(DS[0] == ((Sprim[1] - Sprim[0]) >> known_low)):
......@@ -199,5 +239,3 @@ for blabla in range(n):
print(n)
print("cpt:")
print(cpt)
print("cptrotfail:")
print(cptrotfail)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment