求解二次方程组

时间:2015-08-14 01:04:18

标签: python equation sqrt

我正在使用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已知。

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

1 个答案:

答案 0 :(得分:1)

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

仅提供了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都是整数,因此C12C22也是如此。

所以第一步是计算你给出的值的平方(因为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),只需要一个超过6个百分之秒的闪光灯。< / p>

但是你应该记住,如果攻击者拥有C1/C2值,他们也可以快速获得结果。并且,即使他们没有拥有它,事实上只有64K的可能性意味着他们可以在一小时一小时内尝试所有可能的价值。因此,我不会使用这种方法存储任何有价值的东西: - )