首先,我知道Python无需使用按位运算符就可以很好地处理此问题,因为第三行代码应该清楚。我最终试图在C中完成分配任务-在不支持uint_128t的体系结构上实现RSA(因此代码中的p,q和n变量);我对Python更好,并且尝试使用它来理解。编辑:在没有上述支持的情况下,存储total0(128位)是它自己的问题,但是这种概念证明应该可以让我弄清楚其余部分。

我发现this archived magazine讨论了在Motorola 68000 CPU上使用64位产品执行此操作,并尝试在Python中实现该功能,但是增加了一倍。我正确地知道了高32位,但是其余的96位是不正确的(嗯,最后16位也是正确的,但是它们根本没有移位,因此不足为奇)。

万一我在计数位数时遇到数学错误,我尝试使用强行for / for / for循环在range(0,81)中运行total1 / total2 / total3。没有匹配。

p = 10259632476918722477
q = 17757547285565901767
n = p*q

big_mask =    0xffffffff
small_mask =      0xffff

p_lo = p & big_mask
p_hi = p >> 32
q_lo = q & big_mask
q_hi = q >> 32

p_lo_q_lo = p_lo * q_lo
p_lo_q_hi = p_lo * q_hi
p_hi_q_lo = p_hi * q_lo
p_hi_q_hi = p_hi * q_hi

p_lo_q_lo_UPPER = p_lo_q_lo >> 16
p_lo_q_lo_LOWER = p_lo_q_lo & small_mask
p_lo_q_hi_UPPER = p_lo_q_hi >> 16
p_lo_q_hi_LOWER = p_lo_q_hi & small_mask
p_hi_q_lo_UPPER = p_hi_q_lo >> 16
p_hi_q_lo_LOWER = p_hi_q_lo & small_mask
p_hi_q_hi_UPPER = p_hi_q_hi >> 16
p_hi_q_hi_LOWER = p_hi_q_hi & small_mask

# Original, incorrect implementation
#total0 = p_hi_q_hi_UPPER
#total1 = (p_lo_q_hi_UPPER + p_hi_q_lo_UPPER + p_hi_q_hi_LOWER)
#total2 = (p_lo_q_lo_UPPER + p_lo_q_hi_LOWER + p_hi_q_lo_LOWER)
#total3 = p_lo_q_lo_LOWER
#total = total0 << 80 | total1 << 33 | total2 << 14 | total3 << 0

# Corrected implementation
total0 = p_hi_q_hi_UPPER << 80
total1 = p_hi_q_hi_LOWER << 64
total2 = (p_lo_q_hi_UPPER + p_hi_q_lo_UPPER) << 48
total3 = (p_lo_q_hi_LOWER + p_hi_q_lo_LOWER) << 32
total4 = p_lo_q_lo_UPPER << 16
total5 = p_lo_q_lo_LOWER

total = total0 + total1 + total2 + total3 + total4 + total5

print("\n")
if (n==total):
  print("Match!")
else:
  print("No match.")
print("\n")
print("Actual:   " + str(n))
print("Computed: " + str(total))

print("\n")
# Strip '0b' off of the binary string so the list groupings display logically
hex_n = hex(n)[2:]
hex_total = hex(total)[2:]
print("Actual:   ", end="")
print("\t" + str([hex_n[i:i+4] for i in range(0, len(hex_n), 4)]))
print("Computed: ", end="")
print("\t" + str([hex_total[i:i+4] for i in range(0, len(hex_total), 4)]))


我将total0移位80位的想法是,它是一个48位数字,因此应该在右边填充80 0。 total1是47位,因此左移33(80-47)。 total2是44位,因此左移14(47-33)。最后,因为它是LSDW,所以将total3保持原样。

最佳答案

我认为在最后创建total值时,您的班次金额不对。这是各种中间值的偏移量:

p_lo         0
p_hi        32
q_lo         0
q_hi        32

p_lo_q_lo    0
p_lo_q_hi   32
p_hi_q_lo   32
p_hi_q_hi   64

p_lo_q_lo_UPPER    16
p_lo_q_lo_LOWER     0
p_lo_q_hi_UPPER    48
p_lo_q_hi_LOWER    32
p_hi_q_lo_UPPER    48
p_hi_q_lo_LOWER    32
p_hi_q_hi_UPPER    80
p_hi_q_hi_LOWER    64


排序最后一组:

p_hi_q_hi_UPPER    80
p_hi_q_hi_LOWER    64
p_lo_q_hi_UPPER    48
p_hi_q_lo_UPPER    48
p_lo_q_hi_LOWER    32
p_hi_q_lo_LOWER    32
p_lo_q_lo_UPPER    16
p_lo_q_lo_LOWER     0


因此,有6种不同的最终移位量,而不是4种。通过在最后创建6个total变量并将其与上述移位量相加,应该很容易解决。

关于python - 位移位以获得128位乘积,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56722515/

10-11 21:24