def randInt(n): cryptogen = SystemRandom() k = log2(n) if(k <= 0): k=1 k = ceil(k) r = n while(r >= n or r<=0): r = cryptogen.getrandbits(k) return r
def sameCbits(): hashes = {} randomObj = SystemRandom() r, c = 40, 160 nrounds = 2 rformat = "{:0" + str(r - 2) + "b}" for i in range(2**(c // 2)): m = rformat.format(randomObj.getrandbits(r - 2)) lastcbits = SHA3_d(m, c // 2, r + c, nrounds)[1] c_int = int(lastcbits, 2) if c_int not in hashes: hashes[c_int] = int(m, 2) elif hashes[c_int] != int(m, 2): print("i=", i) # print("Collision! Pair") # print(hashes[c_int], int(m, 2)) m1, m2 = hashes[c_int], int(m, 2) print("m1 = ", m1, "m2 = ", m2) break return m1, m2
def _generate_key(self): system_rand = SystemRandom() # generates random numbers from sources provided by the operating system self.key_size = system_rand.choice(SESSION_KEY_SIZES) session_key = system_rand.getrandbits(self.key_size) self.session_key = session_key.to_bytes(self.key_size // 8, byteorder='little')
from secrets import SystemRandom from algorithms import sqm # USED FOR SECURE NUMBER GENERATION crypto_gen = SystemRandom() # PUBLIC PARAMETERS p = crypto_gen.getrandbits(128) alpha = crypto_gen.getrandbits(128) # MAKE SURE ALPHA IS A GENERATOR AND SMALLER THAN p while alpha > p and sqm(alpha, int((p - 1) / 2), p) != 1: if not sqm(alpha, p - 1, p) == 1: alpha = crypto_gen.getrandbits(128) # PRIVATE KEY GENERATING a = crypto_gen.randrange(2, p - 2) # KEY a b = crypto_gen.randrange(2, p - 2) # KEY b # PUBLIC KEYS K_pub_A = sqm(alpha, a, p) # KEY A K_pub_B = sqm(alpha, b, p) # KEY B # SHARED KEY (SECRET) K_ab = sqm(K_pub_B, a, p) # CHECK SHARED KEY if not K_ab == sqm(K_pub_A, b, p): print("[FATAL ERROR] Shared key's are not matching") else: print(f"[PUBLIC] p = ({hex(p)}), alpha = ({hex(alpha)})")
# secrets: Generate cryptographically strong pseudo-random numbers suitable for managing secrets such as account authentication, tokens, and similar. # secrets.SystemRandom: Alternate random number generator using sources provided by the operating system (such as /dev/urandom on Unix or CryptGenRandom on Windows). Not available on all systems (see os.urandom() for details). ! Considerações: Como pode-se notar, a biblioteca utiliza como pool de entropia as fontes fornecidas pelo sistema. - /dev/urandom :: Unix - CryptGenRandom :: MS-Windows """ # 🚨 Gerador randomico SEGURO generator = SystemRandom() print(generator.getrandbits(1024)) # Gera um inteiro de 1024-bits print(generator.random()) # 🕹 Gerador randomico USUAL do Python print(random.random()) """ ! Conclusão: Seguindo as documentações, ambos os geradores utilizam a mesma fonte de entropia. ? Podemos então afirmar que o PRNG built-in do Python é seguro? """