我正在使用Python进行加密程序。
它包括阅读随机短语,如HELLO
。然后它分配相应的ASCII值,如:
H = 72, E = 79.
然后,使用毕达哥拉斯'定理,它会创建两个数字C1
和C2
,如下所示:
C1 = sqrt(A^2 + (A+B)^2);
C2 = sqrt(B^2 + (A+B)^2)
其中,在这种情况下A = H
和B = E
。这将是加密部分,但我在解决系统时遇到问题,系统将充当解密器。
如何使用python解决此系统?
C1 = sqrt(A^2 + (A+B)^2);
C2 = sqrt(B^2 + (A+B)^2);
当然只有C1
和C2
已知。
我需要一个新模块吗?哪一个?
答案 0 :(得分:1)
如果你只是在谈论使用这两个字符加密,那不是一个好主意。
仅提供了65,536种可能的变体(提到了两个ASCII字符,但我假设一个完整的8位八位字节,因此256乘以256),它很容易暴力破解。首先,我们知道 A
和B
的每个值都会生成一个唯一的对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)
此外,由于A
和B
都是整数,因此C12
和C22
也是如此。
所以第一步是计算你给出的值的平方(因为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")
在我的机器上,搜索最慢的解决方案(a
和b
都设置为255),只需要一个超过6个百分之秒的闪光灯。< / p>
但是你应该记住,如果攻击者拥有C1/C2
值,他们也可以快速获得结果。并且,即使他们没有拥有它,事实上只有64K的可能性意味着他们可以在一小时一小时内尝试所有可能的价值。因此,我不会使用这种方法存储任何有价值的东西: - )