Sto guardando uno schema di crittografia a chiave pubblica basato su SAT e mi sono ispirato a sfidarmi a scrivere un'implementazione di questo schema di crittografia su Python.
Una parte della codifica del codice sarebbe quella di generare funzioni booleane casuali in forma normale algebrica in un certo insieme di variabili binarie. Sono nuovo nella codifica e non riesco a capire come generare le funzioni casuali richieste.
Modifica
Ho già scritto del codice in sage (e fatto diverse esecuzioni in Python) per la generazione delle chiavi. Dal momento che non riesco a inserire il codice in un commento, lo sto mettendo qui. Mentre sono consapevole che il codice potrebbe essere ingenuo, ho controllato con piccoli esempi e mi sembra a posto.
#n-number of binary variables
#m-number of clauses
#k-number of literals in each clause
def key_gen(n,m,k):
print("the list of variables")
print([var('x'+str(n)) for n in range(n+1)]) #listing the variables
print("")
priv=[randint(0,1) for x in range(n)] #choose randomly the private key
pub=matrix(m,k,0) #store the variables used as a m*k matrix
signs=matrix(m,k,0) #store the signs as a m*k matrix
i=0
j=0
while j<m:
clause=sorted((sample(xrange(0,n),k))) #choose k variables at random
sgn=[randint(0,1) for x in range(k)] #choose their signs at random
value=0
for i in xrange(0,k):
value += (mod(sgn[i]+priv[clause[i]],2)) #check the truth value of the clause
if value!=0: #the clause is accepted iff there is
pub[j]=clause #at least one literal with truth value one
signs[j]=sgn
j=j+1
i=i+1
print("")
print("private key")
print(priv)
print("")
print("the matrix of variables ")
print(pub)
print("")
print("the matrix of signs")
print(signs)
Ho provato a fare qualcosa per quanto riguarda la crittografia.
#encryption
#n-number of variables
#pub is a m*k-matrix, where in its rows are stored the clauses
#signs-a m*k matrix where are stored the signs of literals
#y-bit to be encrypted
#alpha, beta encryption parameters
def encrypt(n,pub,signs,alpha,beta,y):
if ((beta > len(pub.rows())) or (beta >= alpha)):
print("Encryption is not possible")
else:
m=len(pub.rows())
k=len(pub.columns())
g_alpha=0
for i in xrange(0,alpha):
block=matrix(beta,k,0) #store the tuples of clauses as beta*k matrix
nr=sorted((sample(xrange(0,m),beta))) #choose at random beta clauses
g_beta=0
for j in xrange(0,beta):
block[j]=pub[nr[j]] #store clauses according to their position
B=BooleanPolynomialRing(n,'x')
used_var=[B.gens()[pub[nr[j]][i]] for i in xrange(k)] #store the
c_j=0 #used variables
for i in xrange(0,k):
c_j+=(B.gen(pub[nr[j]][i]) + signs[nr[j]][i]+1) #calculate the negation
zero_list=[0 for x in xrange(k)]
dict={key:value for key,value in zip(used_var,zero_list)}
f=B.random_element()
R=f.subs(dict) #generate R
g_beta+= c_j*R
g_alpha+=g_beta
g=y+g_alpha
print("the encrypted bit is",g)
Decodifica:
#priv- a list of numbers
#g-a symbolic expression-the cipher
def decrypt(priv,g):
n=len(priv)
B=BooleanPolynomialRing(n,'x')
A=[B.gen(i) for i in xrange(n)]
f=B(g) #get a Boolean Polynomial from symbolic expression
dict={key:value for key,value in zip(A,priv)}
s=f.subs(dict) #evaluate g(priv)
print('decrypted bit is',s)