请帮我理解BBS算法。我做了这个实现:
class EmptySequenseError(Exception):
pass
class BlumBlumShub(object):
def __init__(self, length):
self.length = length
self.primes = e(1000) # Primes obtained by my own Sieve of Eratosthenes implementation.
def get_primes(self):
out_primes = []
while len(out_primes) < 2:
curr_prime = self.primes.pop()
if curr_prime % 4 == 3:
out_primes.append(curr_prime)
return out_primes
def set_random_sequence(self):
p, q = self.get_primes()
m = p * q
self.random_sequence = [((x+1)**2)%m for x in range(self.length)]
def get_random_sequence(self):
if self.random_sequence:
return self.random_sequence
raise EmptySequenseError("Set random sequence before get it!")
我有几个问题。起初我不想使用random
库,这太天真了。我的序列越来越多,它不是绝对随机的。 如何防止返回序列增加?我不明白这部分算法描述:
在算法的每一步,一些输出都来自 x n + 1 ;输出通常是 x n + 1 的位奇偶校验或 x n + 1
请向我解释一下这是什么意思?
答案 0 :(得分:4)
for x in range(self.length):
self.random_sequence.append((x ** 2) % m)
只需生成[(x ** 2) % m for x in range(self.length)]
,大致为x n + 1 = n 2 mod M.
算法假设为:x n + 1 = x n 2 mod M
你看到你的版本与众不同吗?
至于引用 - 你没有说出来自哪里,但Wikipedia有:
在算法的每一步,一些输出都来自 x n + 1 ;输出通常是 x n + 1 的位奇偶校验或 x n + 1
这意味着 x n + 1 是下一次迭代的种子,但不伪 - 返回随机数。相反,返回值来自 x n + 1 ,通过计算其位奇偶校验(每次迭代产生0或1),或者只取一些数量的顶部位。
答案 1 :(得分:3)
Blum Blum Shub在“应用密码学手册”第5.5.2节的Chapter Five中有所描述。关于随机数生成有很多有用的东西。
答案 2 :(得分:2)
我宁愿将我的理解正式化为答案。
class BlumBlumShub(object):
def __init__(self, length):
self.length = length
self.primes = e(1000)
def gen_primes(self):
out_primes = []
while len(out_primes) < 2:
curr_prime = self.primes[random.randrange(len(self.primes))]
if curr_prime % 4 == 3:
out_primes.append(curr_prime)
return out_primes
def random_generator(self):
x = random.randrange(1000000)
while self.length:
x += 1
p, q = self.gen_primes()
m = p * q
z = (x**2) % m
self.length -= 1
yield str(bin(z).count('1') % 2)
def get_random_bits(self):
return ''.join(self.random_generator())
如果我错误地理解了某些内容,请解释我的错误。