32位操作系统如何执行2 ^ 56模7?

时间:2010-08-22 14:01:42

标签: algorithm math cryptography modulo bignum

如果系统在密码学中使用32位操作系统,系统如何执行2 ^ 56模7?

它是如何存储在内存中的?

8 个答案:

答案 0 :(得分:16)

关于任意精度算术

32位操作系统不会限制您拥有超过该大小的自定义类型。您的应用程序可以使用两个32位字,并将其视为一个64位数字。大多数编程语言甚至都有一个“双字”整数类型来简化问题。

您可以进一步扩展该概念,以创建仅受有限内存量限制的任意精度积分数据类型。基本上你有一个数组的单词,你将 N 位数存储在这个数组的单词中。

它是一个32位操作系统的事实本身并不限制你可以做的数值计算。例如,Java long是64位整数类型,无论它在哪里运行。对于任意精度,java.math.BigInteger提升赌注并提供“无限字大小”抽象。是的,即使在32位操作系统中也可以使用这个“功能”(因为这绝不是开始时的限制因素)。

另见


关于整数环上的数学

查找modular multiplicative inversemodular 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在语言级别提供任意精度intlong

答案 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。这意味着你基本上可以做到

  1. 从x = 1开始
  2. x =(x * 2)%7 56次

答案 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位

时发生的