本原多项式 M序列和AES不可约多项式

密码学本原多项式

1.本原多项式是近世代数中的一个概念,是唯一分解整环上满足所有系数的最大公因数为1的多项式。本原多项式不等于零,与本原多项式相伴的多项式仍为本原多项式
2.高斯引理:本原多项式的乘积还是本原多项式。


如图:

代数式系数对应的0 1 字串,满足,用8进制变为对应的十进制,若为素数,则为本原多项式此处有错误:不能用素数判断
以下列出几个本原多项式。

此图有错误:
我也是被人误导了,下图中有些数据有错误,还有不应该用是否为素数来判断多项式为本原多项式。

在这里插入图片描述

正确的图(以书为主):
在这里插入图片描述


AES密码学不可约多项式:

不可约多项式和本原多项式不同。

m(x)=(x8+x4+x3+x+1)这个是密码学AES算法查S盒时用到的不可约多项式

公式:y=Ax-1+b
在这里插入图片描述

这里给出S盒中的一部分
在这里插入图片描述

若给出x = 00001001,想要得到y?
方法一:
x转化成为16进制数字为x=09
查表可以得到x对应的y=01

方法二:
将00001001写为多项式为x3+1
求出(x3+1)-1mod(m(x))的逆元后
即为x6+x3+x2+x+1
转化为2进制即为01001111
在这里插入图片描述
高位在下,低位在上,利用公式得出00000001,即y=01


谢谢!

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是利用 MATLAB 编写的具有菜单页面的 m 序列生成器代码,可以根据输入的移位寄存器阶数和寄存器的初值生成相应的 m 序列: ```matlab % m序列生成器 clear all; while 1 % 无限循环,直到选择退出 % 菜单页面 fprintf('请选择移位寄存器阶数:\n'); fprintf('1. 1阶\n'); fprintf('2. 2阶\n'); fprintf('3. 3阶\n'); fprintf('4. 4阶\n'); fprintf('5. 5阶\n'); fprintf('6. 6阶\n'); fprintf('7. 7阶\n'); fprintf('8. 8阶\n'); fprintf('9. 9阶\n'); fprintf('10. 10阶\n'); fprintf('0. 退出\n\n'); % 接收用户输入 n = input('请输入选项序号:'); if n == 0 break; % 选择退出,跳出循环 elseif n < 1 || n > 10 fprintf('输入错误,请重新选择!\n\n'); continue; % 输入错误,重新进入循环 end % 根据移位寄存器阶数查表得到本原多项式系数 switch n case 1 p = oct2poly('7'); % 1阶的本原多项式系数为7 case 2 p = oct2poly('15'); % 2阶的本原多项式系数为13 case 3 p = oct2poly('43'); % 3阶的本原多项式系数为23 case 4 p = oct2poly('105'); % 4阶的本原多项式系数为45 case 5 p = oct2poly('207'); % 5阶的本原多项式系数为103 case 6 p = oct2poly('413'); % 6阶的本原多项式系数为203 case 7 p = oct2poly('1005'); % 7阶的本原多项式系数为421 case 8 p = oct2poly('2107'); % 8阶的本原多项式系数为1053 case 9 p = oct2poly('4005'); % 9阶的本原多项式系数为2057 case 10 p = oct2poly('10123'); % 10阶的本原多项式系数为5103 end % 接收用户输入 x = input('请输入移位寄存器的初值(二进制形式):','s'); l = length(x); % 初始化寄存器 register = zeros(1, n); for i = 1:n register(i) = str2num(x(l-i+1)); end % 生成m序列 m = zeros(1, 2^n-1); for i = 1:2^n-1 m(i) = register(n); feedback = mod(sum(register.*p), 2); % 计算反馈 register(2:n) = register(1:n-1); % 移位 register(1) = feedback; % 更新最低位 end % 输出多项式系数和m序列 fprintf('多项式系数为:'); disp(p); fprintf('m序列为:'); disp(m); fprintf('\n'); end ``` 上述代码中,我们利用了 MATLAB 自带的 `input` 函数接收用户输入,利用 `switch` 语句根据输入的移位寄存器阶数查表得到本原多项式系数,利用 `oct2poly` 函数将八进制转换成多项式系数,然后利用循环生成 m 序列。最后,我们输出多项式系数和 m 序列,然后重新进入循环,等待下一次输入。当用户选择退出时,我们利用 `break` 语句跳出循环,程序结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值