求解二次方程组

Solving a system of Quadratic Equations

我正在 Python.

做一个密码学程序

它包括阅读一个随机短语,例如 HELLO。然后它分配它各自的 ASCII 值,如:

H = 72, E = 79.

然后,使用毕达哥拉斯定理,它创建两个数字 C1C2,如下所示:

C1 = sqrt(A^2 + (A+B)^2);
C2 = sqrt(B^2 + (A+B)^2)

其中,在本例中为 A = HB = E。那将是加密部分,但我在解决将充当解密器的系统时遇到问题。

如何使用 python 解决这个系统?

C1 = sqrt(A^2 + (A+B)^2); 
C2 = sqrt(B^2 + (A+B)^2);

当然只有C1C2是已知的。

我需要一个新模块吗?哪一个?

如果您只是谈论使用这两个字符进行加密,那不是一个好主意。

这只给出了 65,536 种可能的变体(提到了两个 ASCII 字符,但我假设一个完整的 8 位八位字节,所以 256 乘以 256),很容易暴力破解它。首先,我们 知道 AB 的每个值都会生成一个唯一的对 C1/C2,根据以下不生成重复项的程序:

lookup = {}
for a in range(256):
    for b in range(256):
        c1s = a*a + (a+b)*(a+b)
        c2s = b*b + (a+b)*(a+b)
        lkey = "%d:%d"%(c1s,c2s)
        lookup[lkey] = 1
print(len(lookup))                 # gives 65536 (256 squared)

此外,由于 AB 都是整数,因此 C1<sup>2</sup>C2<sup>2</sup>.

所以第一步是计算给定值的平方(因为 sqrt 是一个潜在的昂贵操作),考虑到浮点不准确的可能性:

c1s = int(c1 * c1 + 0.1)
c2s = int(c2 * c2 + 0.1)

然后,简单地暴力破解:

for a in range(256):
    for b in range(256):
        if c1s != a*a + (a+b)*(a+b):
            continue
        if c2s == b*b + (a+b)*(a+b):
            print(a,b)
            sys.exit(0)
print("No solution")

在我的机器上,搜索最慢的解决方案(ab 都设置为 255),只需要超过六个 百分之一一秒钟。

但是您应该记住,如果攻击者拥有 C1/C2 值,他们也可以那么快地获得结果。而且,即使他们没有,只有 64K 种可能性这一事实意味着他们可以在一个半刻钟多一点的时间内尝试所有可能的值。所以我不会使用这种方法来长期存储任何有价值的东西:-)