今天看了一位博主阐述的百万富翁问题,记录一下学习心得。
假设甲有i个亿,乙有j个亿。通过两方安全计算得知谁更有钱。
该算法实现的步骤如下(本文中的所有m - n之间包含两端):
- 先随机生成两个素数p和q(代码中p和q不能相等且都是1-100之间)
- 设e和(p-1)*(q-1)互质求出满足该条件最小的正整数e
- 再根据(ed)%((p-1)(q-1)) = 1求出满足该条件最小的值d
- 设n = p*q,假设甲有i个亿的资产,乙有j个亿的资产,i,j在1-9之间
- 随机选一个大整数x(代码中x取值1-100之间)
- 把大整数x加密得到密文K = x^e % n
- 让甲收到的数为c = K - j
- 对c + 1到c + 10进行解密:即让k遍历1-10中的10个正整数,得到的每个(c + k)^e % n都依次放入 c_list 数组中。
- 再取一个随机数p0,选取合适大小的p0,这里根据感觉写了1-99的随机数,生成的序列的值也要求小于100。
- 10.把c_list每个值依次除以p0得到的余数放入x_list
- 再把x_list前i位包括第i位不动,后面的10-i个数字加1得到y_list
- 取y_list第j个数字y_list[j - 1]
- 把y_list[j - 1]和 x%p对比:
a)如果两者相等,则i >= j,即甲比乙资产更多或者一样。
b)如果两者不等,则i < j,即乙比价资产更多。