如果系统在密码学中使用32位操作系统,系统如何执行2 ^ 56模7?
它是如何存储在内存中的?
答案 0 :(得分:16)
32位操作系统不会限制您拥有超过该大小的自定义类型。您的应用程序可以使用两个32位字,并将其视为一个64位数字。大多数编程语言甚至都有一个“双字”整数类型来简化问题。
您可以进一步扩展该概念,以创建仅受有限内存量限制的任意精度积分数据类型。基本上你有一个数组的单词,你将 N 位数存储在这个数组的单词中。
它是一个32位操作系统的事实本身并不限制你可以做的数值计算。例如,Java long
是64位整数类型,无论它在哪里运行。对于任意精度,java.math.BigInteger
提升赌注并提供“无限字大小”抽象。是的,即使在32位操作系统中也可以使用这个“功能”(因为这绝不是开始时的限制因素)。
查找modular multiplicative inverse或modular exponentiation是密码学领域常见的数学/算法任务。
您可能希望在此处使用的一个身份如下:
A * B (mod M) == (A (mod M)) * (B (mod M)) (mod M)
要查找 x = 2 56 (mod 7), NOT 必须先计算并存储2 56 < / SUP>。如果你有 y = 2 55 (mod 7) - 介于0..6之间的数字 - 你可以找到 x = y * 2(mod 7)。
但你如何找到 y = 2 55 (mod 7)?好吧,一种天真的方法是线性地应用该过程,并首先尝试找到 z = 2 54 (mod 7),依此类推。这是一个线性取幂,但你可以通过执行例如exponentiation by squaring
也就是说,如果您说2 8 ,您可以将其平方为立即获得2 16 。然后你可以将其平方立即得到2 32 。
有许多复杂的数学算法适用于加密,无论它是否在32位或64位操作系统上运行的程序中实现都不直接相关。只要有足够的内存,计算机就能够执行任意精度算术。
正是因为任意精度算法是一个有用的抽象,许多高性能库都可用,因此您可以在预先存在的框架之上构建应用程序,而不必从头开始构建。
某些高级语言甚至内置了任意精度算术。例如,Python在语言级别提供任意精度int
和long
。
答案 1 :(得分:3)
2**56 == 2**(28+28) == 2**28 * 2**28 == (2**28)**2
2**28 == 2**(14+14) == 2**14 * 2**14 == (2**14)**2
2**14 == 2**(7+7) == 2**7 * 2**7 == (2**7)**2
2**7 == 2**(3+3 +1) == 2**3 * 2**3 * 2 == (2**3)**2 * 2
2**3 == 2**(1+1 +1) == 2**1 * 2**1 * 2 == (2**1)**2 * 2
2**56 == (2**28)**2 == ((2**14)**2)**2 == (((2**7)**2)**2)**2
== (((2*(2**3)**2)**2)**2)**2 == (((2*(2*(2**1)**2)**2)**2)**2)**2
2**56 %7
== (((2*(2*(2**1)**2)**2)**2)**2)**2 %7
== (((2*(2*(2**1 %7)**2 %7)**2 %7)**2 %7)**2 %7)**2 %7
== (((2*(2*(2)**2 %7)**2 %7)**2 %7)**2 %7)**2 %7
== (((2*(2*4 %7)**2 %7)**2 %7)**2 %7)**2 %7
== (((2*(1)**2 %7)**2 %7)**2 %7)**2 %7
== (((2 %7)**2 %7)**2 %7)**2 %7
== ((2**2 %7)**2 %7)**2 %7
== ((4)**2 %7)**2 %7
== (16 %7)**2 %7
== (2)**2 %7
== 4 %7
== 4
so (2**56) % 7 == 4
你会注意到我们从未处理任何大数字(实际上最大数字是56)。
此外:
2**224 %7 == (2**56)**4 %7 == (4*4*4*4) %7 ==
((16%7) * (16%7)) %7 == (2*2) %7 == 4 %7 == 4
因此也2**896 %7 = 4
等(自896 = 4 * 224
起,224 = 4 * 56
)。
答案 2 :(得分:2)
模幂运算算法用于此类操作。这篇维基百科文章讲述了它是如何完成的:http://en.wikipedia.org/wiki/Modular_exponentiation
答案 3 :(得分:2)
通常,如果你知道你的数字会变得非常大,你将使用像GMP(Gnu Multi-Precision)这样的库来处理数学。如果你的手上有2 ^ 32个手指,它可以做你在纸上做的事情。
答案 4 :(得分:0)
哪个系统?哪种架构?
一般来说,在32位架构上, 会出现溢出结果。有些语言有内置的,任意大的数字类型,可以处理这些计算。这方面的例子是Java中的BigDecimal
和Python中的内置long int
。
答案 5 :(得分:0)
一个人使用(a * b)mod c =((a mod c)*(b mod c))mod c。这意味着你基本上可以做到
答案 6 :(得分:0)
我认为你的术语有点混乱。
32位操作系统或32位架构是机器地址限制为32位的架构。 32位架构的算术指令在64位整数和/或64位浮点数上运行并不罕见。
因此,具有32位架构(并运行32位操作系统)的机器很可能会使用64位算术并将结果存储为64位long
或{{1使用2个连续的32位字。
答案 7 :(得分:0)
也可以添加其他答案,这些答案可以很好地解释32 int和模乘法逆和什么不
我将解释32位CPU是什么
32 bit
大多数人都知道它们的CPU与地址总线大小有关
这就是可用地址的数量,例如在x86(您的普通桌面CPU [AMD,Intel])处理器上
这允许2^32
字节的地址空间或4GB
这通常在可寻址硬件和RAM之间分配,因此实际实现64 bit
处理器的原因是因为我们也越来越近了RAM限制的4GB
作为旁注,这是先前在CPU为16位
时发生的