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

我正在尝试实现一个类似于Shamir使用Python的秘密共享的加密系统。从本质上讲,我有一些代码可以生成一个点列表,可用于在这些点形成的梯度的y截距处找到密码。密码是ASCII中的数字(每个ASCII字符使用两位数),因此是一个非常大的数字,密码更大。例如,密码ThisIsAPassword将生成一个点列表,如下所示:


x    y

9556 66707086867915126140753213946756441607861037300900

4083 28502040182447127964404994111341362715565457349000

9684 67600608880657662915204624898507424633297513499300

9197 64201036847801292531159022293017356403707170463200

需要明确的是,这些点是在随机选择的斜率上生成的(这很好,因为重要的是y截距)。


在尝试制作程序以解码密码时会出现问题。使用正常的数学运算,Python无法准确地找到密码,因为数字的大小。这是我的代码:


def findYint(x,y):

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

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

    return yint


def 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 random


def encryptWord(word):

    numlist = []

    for i in range(len(word)):

        numlist.append(str(ord(word[i])).zfill(3))

    num = int("".join(numlist))

    return num


def 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, yvals


def 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)



墨色风雨
浏览 130回答 3
3回答

喵喵时光机

如您所知,Python的内置类型可以处理任意大的整数,但该类型具有有限的精度。代码中唯一处理非 s 数字的部分似乎是以下函数:intfloatintdef findYint(x,y):&nbsp; &nbsp; slope = (y[1] - y[0]) / (x[1] - x[0])&nbsp; &nbsp; yint = int(y[0] - slope * x[0])&nbsp; &nbsp; return yint这里的除法结果为 a ,即使结果与 .此外,我们不能安全地在这里用运算符进行整数除法,因为在截断应该发生之前,它将乘以。floatint//slopex[0]因此,要么您需要做一些代数才能仅使用s获得相同的结果,要么您需要使用精确的非整数类型而不是来表示分数(y 1 - y 0)/ (x1 - x0)。幸运的是,Python的标准库有一个名为Refute的类,它将做你想要的:intfloatfrom fractions import Fractiondef findYint(x,y):&nbsp; &nbsp; slope = Fraction(y[1] - y[0], x[1] - x[0])&nbsp; &nbsp; yint = int(y[0] - slope * x[0])&nbsp; &nbsp; return yint

当年话下

应该只能使用基于整数的数学来执行此操作:def&nbsp;findYint(x,y): &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(y[0]&nbsp;*&nbsp;(x[1]&nbsp;-&nbsp;x[0])&nbsp;-&nbsp;(y[1]&nbsp;-&nbsp;y[0])&nbsp;*&nbsp;x[0])&nbsp;&nbsp;//&nbsp;(x[1]&nbsp;-&nbsp;x[0])这样可以避免浮点算术及其精度约束。

郎朗坤

分数和所有整数数学的重写都很好。对于真正的大整数,您可能会发现自己想要&nbsp;https://pypi.org/project/gmpy/&nbsp;而不是内置int类型。我已经成功地用它来测试大素数。或者,如果您确实想要带有小数点的数字,请尝试十进制。Decimal(“1”) - 例如。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python