python中整齐的长整数表示

时间:2012-03-18 21:08:04

标签: python rsa long-integer

我正在使用Python编写简单的RSA解密例程(我对Python有点新手)并且似乎找不到在我的代码中整齐地格式化长整数的方法。 整数长度为2048位,如果写入一行,则向右延伸。在C中,这样的整数将由字数组表示,可以在一个页面上整齐地写出。 我将如何在Python中执行此操作?我尝试了一个明显的解决方案:

modulus = 0xaaaaa\
bbbbb\
ccccc

这根本不起作用。我发现的唯一工作就是:

smodulus = "\
aaaaa\
bbbbb\
ccccc"
modulus = long(smodulus,16)

你能为长整数建议一种格式化方法吗?

感谢。

3 个答案:

答案 0 :(得分:2)

Python concatenates adjacent string literals所以你可以写:

long('01234567'
     '89abcdef'
     '01234567'
     '89abcdef',
     16)

答案 1 :(得分:0)

howbout:

modulus =( 0xaaaaaaaa << 64
         | 0xbbbbbbbb << 32
         | 0xcccccccc << 0 )

或者,如果不希望跟踪这些偏移,那么这是一个简单的帮手:

def longmodulus(size, seq):
    return sum(leg << offset for leg, offset in zip(seq, xrange(size*len(seq)-size, -size, -size)))

modulus = longmodulus(32, 
    (0xaaaaaaaa, 
     0xbbbbbbbb, 
     0xcccccccc))

答案 2 :(得分:-1)

创建自己的解析字符串的函数,并使用它来定义全局。

SMODULUS = parse("""
    aaaab
    bbbbb
    ccccc
    """)

def myFunc(...):
    crypomath_and_stuff = SMODULUS | abc & etc
    ...

你可能能够绕过它,并避免使它成为一个全局的,但这取决于python解释器是否足够聪明,可以将常量函数编译为预处理数据,JIT样式(并且还取决于如果python语言的语义甚至允许这样的优化)。要自己试验一下,可以使用dis.dis(python反汇编程序)来查看是否确实进行了优化(或者更可能是未进行优化)。如果您根本不关心性能,也可以将其内联,或者这些是对使用parse d变量的函数的一次性调用。