【发布时间】:2021-12-07 13:58:28
【问题描述】:
我想在 F_{2^8} 中执行加法和乘法
我目前有这段代码,它似乎适用于加法,但不适用于乘法;问题似乎是,当我以 100011011 取模(表示 x^8 + x^4 + x^3 + x + 1)时,它似乎没有这样做。另一个想法是使用 numpy.polynomial 但它不是那么直观。
def toBinary(self, n):
return ''.join(str(1 & int(n) >> i) for i in range(8)[::-1])
def add(self, x, y):
"""
"10111001" + "10010100" = "00101101"
"""
if len(x)<8:
self.add('0'+x,y)
elif len(y)<8:
self.add(x,'0'+y)
try:
a = int(x,2); b = int(y,2)
z = int(x)+int(y)
s = ''
for i in str(z):
if int(i)%2 == 0:
s+='0'
else:
s+='1'
except:
return '00000000'
return s
def multiply(self, x, y):
"""
"10111001" * "10010100" = "10110010"
"""
if len(x)<8:
self.multiply('0'+x,y)
elif len(y)<8:
self.multiply(x,'0'+y)
result = '00000000'
result = '00000000'
while y!= '00000000' :
print(f'x:{x},y:{y},result:{result}')
if int(y[-1]) == 1 :
result = self.add(result ,x)
y = self.add(y, '00000001')
x = self.add(self.toBinary(int(x,2)<<1),'100011011')
y = self.toBinary(int(y,2)>>1) #b = self.multiply(b,inverse('00000010'))
return result
【问题讨论】:
-
也许我不了解最新的术语,但什么是“F_{2^8}”?说代码不适用于乘法是一个问题。我们可以帮助解决具体的技术问题,而不是对代码或建议的开放式请求。请编辑您的问题以显示您迄今为止尝试过的内容,以及您需要帮助的具体问题。请参阅How To Ask a Good Question 页面,详细了解如何最好地帮助我们。
-
F_{2^8} 是一个 2^8 的 Gallois 字段,由每个字符串 8 位组成,我编码的算法是 Rijndael 算法的一个版本,使用模块化归约,但这一步失败了
-
我更新了我的答案以包含一个 python 示例。
标签: python finite-field