为了账号安全,请及时绑定邮箱和手机立即绑定

Python 3中具有大数字的精确数学

Python 3中具有大数字的精确数学

墨色风雨 2022-08-02 15:52:15
我正在尝试实现一个类似于Shamir使用Python的秘密共享的加密系统。从本质上讲,我有一些代码可以生成一个点列表,可用于在这些点形成的梯度的y截距处找到密码。密码是ASCII中的数字(每个ASCII字符使用两位数),因此是一个非常大的数字,密码更大。例如,密码ThisIsAPassword将生成一个点列表,如下所示:x    y9556 667070868679151261407532139467564416078610373009004083 285020401824471279644049941113413627155654573490009684 676006088806576629152046248985074246332975134993009197 64201036847801292531159022293017356403707170463200需要明确的是,这些点是在随机选择的斜率上生成的(这很好,因为重要的是y截距)。在尝试制作程序以解码密码时会出现问题。使用正常的数学运算,Python无法准确地找到密码,因为数字的大小。这是我的代码:def findYint(x,y):    slope = (y[1] - y[0]) / (x[1] - x[0])    yint = int(y[0] - slope * x[0])    return yintdef asciiToString(num):    chars = [num[i:i+3] for i in range(0, len(num), 3)]    return ''.join(chr(int(i)) for i in chars)def main():    fi = open('pass.txt','r')    x,y = [], []    for i in fi:        row = i.split()        x.append(int(row[0]))        y.append(int(row[1]))    fi.close()    yint = findYint(x,y)    pword = asciiToString(str(yint))    print(pword)main()输出(密码为“ThisIsAPassword”):͉)3 ǢΜĩũć»¢ǔ¼通常,我的代码将使用较短的密码,例如“pass”或“word”,但是较大的数字可能没有以将其转换为ASCII所需的确切准确性进行计算。使用精确数学或其他方法的任何解决方案?此外,以下是生成点的代码,以防万一它很重要:import randomdef encryptWord(word):    numlist = []    for i in range(len(word)):        numlist.append(str(ord(word[i])).zfill(3))    num = int("".join(numlist))    return numdef createPoints(pwd, pts):    yint = pwd    gradient = pwd*random.randint(10,100)    xvals = []    yvals = []    for i in range(pts):        n = random.randint(1000,10000)        xvals.append(n)        yvals.append(((n) * gradient) + pwd)    return xvals, yvalsdef main():    pword = input("Enter a password to encrypt: ")    pword = encryptWord(pword)    numpoints = int(input("How many points to generate? "))    if numpoints < 2:        numpoints = 2    xpts, ypts = createPoints(pword, numpoints)
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

如您所知,Python的内置类型可以处理任意大的整数,但该类型具有有限的精度。代码中唯一处理非 s 数字的部分似乎是以下函数:intfloatint


def findYint(x,y):

    slope = (y[1] - y[0]) / (x[1] - x[0])

    yint = int(y[0] - slope * x[0])

    return yint

这里的除法结果为 a ,即使结果与 .此外,我们不能安全地在这里用运算符进行整数除法,因为在截断应该发生之前,它将乘以。floatint//slopex[0]


因此,要么您需要做一些代数才能仅使用s获得相同的结果,要么您需要使用精确的非整数类型而不是来表示分数(y 1 - y 0)/ (x1 - x0)。幸运的是,Python的标准库有一个名为Refute的类,它将做你想要的:intfloat


from fractions import Fraction


def findYint(x,y):

    slope = Fraction(y[1] - y[0], x[1] - x[0])

    yint = int(y[0] - slope * x[0])

    return yint


查看完整回答
反对 回复 2022-08-02
?
当年话下

TA贡献1890条经验 获得超9个赞

应该只能使用基于整数的数学来执行此操作:

def findYint(x,y):
    return (y[0] * (x[1] - x[0]) - (y[1] - y[0]) * x[0])  // (x[1] - x[0])

这样可以避免浮点算术及其精度约束。


查看完整回答
反对 回复 2022-08-02
?
郎朗坤

TA贡献1921条经验 获得超9个赞

分数和所有整数数学的重写都很好。

对于真正的大整数,您可能会发现自己想要 https://pypi.org/project/gmpy/ 而不是内置int类型。我已经成功地用它来测试大素数。

或者,如果您确实想要带有小数点的数字,请尝试十进制。Decimal(“1”) - 例如。


查看完整回答
反对 回复 2022-08-02
  • 3 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信