def encrypt(self, pk, m, salt=None): octetlen = int(ceil(int(pk['N']).bit_length() / 8.0)) EM = self.paddingscheme.encode(m, octetlen, "", salt) if debug: print("EM == >", EM) i = Conversion.OS2IP(EM) ip = integer(i) % pk['N'] #Convert to modular integer return (ip ** pk['e']) % pk['N']
def encrypt(self, pk, m, salt=None): octetlen = int(ceil(int(pk['N']).bit_length() / 8.0)) EM = self.paddingscheme.encode(m, octetlen, "", salt) if debug: print("EM == >", EM) i = Conversion.OS2IP(EM) ip = integer(i) % pk['N'] #Convert to modular integer return (ip**pk['e']) % pk['N']
def hashToZn(self, value): if type(value) == pairing: h = hashlib.new(self.hash_type) h.update(self.group.serialize(value)) #print "digest => %s" % h.hexdigest() # get raw bytes of digest and hash to Zr val = h.digest() return integer(int(self.group.hash(val, ZR))) # do something related to that if type(value) == integer: str_value = int2Bytes(value) # print("str_value =>", str_value) # val = self.group.hash(str_value, ZR) # print("hash =>", val) return integer(int(self.group.hash(str_value, ZR))) return None
def random(self, type=ZR, seed=None): if type == GT: return self.__randomGT() elif type == ZR or type == G1 or type == G2: if seed != None: return self.Pairing.random(type, seed) return self.Pairing.random(type) else: return integer(randomBits(self.secparam))
def random(self, type=ZR, count=1, seed=None): if type == GT: return self.__randomGT() elif type == ZR or type == G1 or type == G2: if seed != None and count == 1: return random(self.Pairing, type, seed) elif count > 1: return tuple([random(self.Pairing, type) for i in range(count)]) return random(self.Pairing, type) else: return integer(randomBits(self.secparam))
def encrypt(self, pk, m, salt=None): if(self.paddingscheme.name == "SAEPEncryptionPadding"): EM = self.paddingscheme.encode(m, pk['n'], pk['s0']) else: m = self.redundancyscheme.encode(m) octetlen = int(ceil(int(pk['N']).bit_length() / 8.0)) EM = self.paddingscheme.encode(m, octetlen, "", salt) if debug: print("EM == >", EM) i = Conversion.OS2IP(EM) ip = integer(i) % pk['N'] #Convert to modular integer return (ip ** 2) % pk['N']
def sign(self,sk, M, salt=None): #apply encoding while True: octetlen = int(ceil(int(sk['N']).bit_length() / 8.0)) em = self.paddingscheme.encode(M, octetlen, "", salt) m = Conversion.OS2IP(em) m = integer(m) % sk['N'] #ERRROR m is larger than N p = sk['p'] q = sk['q'] yp = sk['yp'] yq = sk['yq'] mp = (m ** ((p+1)/4)) % p mq = (m ** ((q+1)/4)) % q r1 = ((int(yp)*int(p)*int(mq)) + ((int(yq)*int(q)*int(mp)))) % int(sk['N']) r2 = int(sk['N']) - int(r1) s1 = (int(yp)*int(p)*int(mq) - int(yq)*int(q)*int(mp)) % int(sk['N']) s2 = int(sk['N']) - int(s1) if(((int((integer(r1) ** 2) % sk['N'] - m)) == 0) or ((int((integer(r2) ** 2) % sk['N'] - m)) == 0) or ((int((integer(s1) ** 2) % sk['N'] - m)) == 0) or ((int((integer(s2) ** 2) % sk['N'] - m)) == 0)): break S = { 's1':r1, 's2':r2, 's3':s1, 's4':s2 } if debug: print("Signing") print("m =>", m) print("em =>", em) print("S =>", S) return S
def verify(self, pk, M, S, salt=None): #M = b'This is a malicious message' octetlen = int(ceil(int(pk['N']).bit_length() / 8.0)) sig_mess = (integer(S['s1']) ** 2) % pk['N'] sig_mess = Conversion.IP2OS(int(sig_mess), octetlen) if debug: print("OS1 =>", sig_mess) dec_mess = self.paddingscheme.decode(sig_mess) if debug: print("Verifying") print("sig_mess =>", sig_mess) print("dec_mess =>", dec_mess) print("S =>", S) return (dec_mess == M)
def OS2IP(self, bytestr, element = False): ''' :Return: A python ``int`` if element is False. An ``integer.Element`` if element is True Converts a byte string to an integer ''' val = 0 for i in range(len(bytestr)): byt = bytestr[len(bytestr)-1-i] if not py3: byt = ord(byt) val += byt << (8 *i) #These lines convert val into a binary string of 1's and 0's #bstr = bin(val)[2:] #cut out the 0b header #val = int(bstr, 2) #return val if element: return integer(val) else: return val
def OS2IP(self, bytestr, element=False): ''' :Return: A python ``int`` if element is False. An ``integer.Element`` if element is True Converts a byte string to an integer ''' val = 0 for i in range(len(bytestr)): byt = bytestr[len(bytestr) - 1 - i] if not py3: byt = ord(byt) val += byt << (8 * i) #These lines convert val into a binary string of 1's and 0's #bstr = bin(val)[2:] #cut out the 0b header #val = int(bstr, 2) #return val if element: return integer(val) else: return val
def sign(self, sk, M, salt=None): # apply encoding modbits = int(sk["N"]).bit_length() k = int(ceil(modbits / 8.0)) emLen = int(ceil((modbits - 1) / 8.0)) em = self.paddingscheme.encode(M, modbits - 1, salt) m = Conversion.OS2IP(em) m = integer(m) % sk["N"] # ERRROR m is larger than N s = (m ** sk["d"]) % sk["N"] S = Conversion.IP2OS(s, k) if debug: print("Signing") print("k =>", k) print("emLen =>", emLen) print("m =>", m) print("em =>", em) print("s =>", s) print("S =>", S) return S
def verify(self, pk, M, S): modbits = int(pk['N']).bit_length() k = int(ceil(modbits / 8.0)) emLen = int(ceil((modbits - 1) / 8.0)) if len(S) != k: if debug: print("Sig is %s octets long, not %" % (len(S), k)) return False s = Conversion.OS2IP(S) s = integer(s) % pk['N'] #Convert to modular integer m = (s**pk['e']) % pk['N'] EM = Conversion.IP2OS(m, emLen) if debug: print("Verifying") print("k =>", k) print("emLen =>", emLen) print("s =>", s) print("m =>", m) print("em =>", EM) print("S =>", S) return self.paddingscheme.verify(M, EM, modbits - 1)
def sign(self, sk, M, salt=None): #apply encoding modbits = int(sk['N']).bit_length() k = int(ceil(modbits / 8.0)) emLen = int(ceil((modbits - 1) / 8.0)) em = self.paddingscheme.encode(M, modbits - 1, salt) m = Conversion.OS2IP(em) m = integer(m) % sk['N'] #ERRROR m is larger than N s = (m**sk['d']) % sk['N'] S = Conversion.IP2OS(s, k) if debug: print("Signing") print("k =>", k) print("emLen =>", emLen) print("m =>", m) print("em =>", em) print("s =>", s) print("S =>", S) return S
def verify(self, pk, M, S): modbits = int(pk['N']).bit_length() k = int(ceil(modbits / 8.0)) emLen = int(ceil((modbits -1) / 8.0)) if len(S) != k: if debug: print("Sig is %s octets long, not %" %(len(S), k)) return False s = Conversion.OS2IP(S) s = integer(s) % pk['N'] #Convert to modular integer m = (s ** pk['e']) % pk['N'] EM = Conversion.IP2OS(m, emLen) if debug: print("Verifying") print("k =>", k) print("emLen =>", emLen) print("s =>", s) print("m =>", m) print("em =>", EM) print("S =>", S) return self.paddingscheme.verify(M, EM, modbits-1)
def convert(self, N, e, d, p, q): return (integer(N), integer(e), integer(d), integer(p), integer(q))
def bytes2integer(self, bytestr): '''Converts a bytes string to an integer object''' return integer(bytestr)
def convert(self, N, p, q, yp, yq): return (integer(N), integer(p), integer(q), integer(yp), integer(yq))