python 有限域函数库_有限域GF(2^8)内乘法代码实现以及原理
在密码学中经常用到有限域的乘法,一般在AES中用到的是GF(2^8)有限域内乘法。什么是有限域呢?有限域通俗的讲就是函数的运算结果全都包含在一个域中,不同于实数域,有限域有一个最大值,所有超过这个最大值的数都会经过一定的方法使他回到这个域中,在密码学中应用很广泛,2^8意味着这个域的最大值是256.
以下代码是GF(2^8)有限域内乘法的C代码实现:
unsignedcharXTIME(unsignedcharx) {
return((x <
}
unsigned charmultiply(unsignedchara, unsignedcharb) {
unsigned chartemp[8] = { a };
unsigned chartempmultiply = 0x00;
inti = 0;
for(i = 1; i
temp[i] = XTIME(temp[i - 1]);
}
tempmultiply = (b & 0x01) * a;
for(i = 1; i <= 7; i++) {
tempmultiply ^= (((b >> i) & 0x01) * temp[i]);
}
returntempmultiply;
}
以下讲一下乘法的原理:
在二进制中,所有的数都能用0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80异或得到,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80的二进制表示如下:
后一个分别是前一个的2倍。假设任意一个数a,他的二进制表示为10101101,可以由以下组合组成:
而任何一个数x和a相乘都可以表示为
所以只要计算出
一切乘法的结果都可以得到。
XTIME函数的含义是求一个数x与0x02的乘积,一般求一个数的2倍,都是作移一位,在有限域内,要计算有限域的乘法,必须先确定一个GF上的8次不可约多项式,Rijndael密码中,这个多项式确定为x^8+x^4+x^3+x+1,如果最高位是1的话,左移一位的同时要异或0x1B,是因为最高位是1的话,再继续左移会超出域的最大值,这个时候需要取除以同余式,也就是异或0x1B。
for(i = 1; i
temp[i] = XTIME(temp[i - 1]);
}
经过这个循环可以得到一串包含8个字符的数组,分别是0x01*x,0x02*x,0x04*x,0x08*x,0x10*x,0x20*x,0x40*x,,0x80*x,放在temp这个数组内。接下来通过这个循环
for(i = 1; i <= 7; i++) {
tempmultiply ^= (((b >> i) & 0x01) * temp[i]);
}
另一个乘数b右移一位和0x01与运算,分别和这8个字符相乘,再把相乘的结果异或。就得到了a和b相乘的结果。
接下来举个例子:
求0x3a*0x24?
首先0x3a=00111010,分别求
0x24=00100100,所以0x3a*0x24=0x3a*00100100=0x04*0x3a^0x20*0x3a=0xe8^0x01=0xe9.
是正确结果。
如果要提高算法的计算效率,还可以这么做。
如果一个乘数的二进制可以表示为
一个乘数表示为
那么a的倍数关系可表示为:
那么他的乘积可以表示为
其中
所以乘法可以表示为
所以还有一种计算方法,那就是按照上面这个矩阵乘法。
#include
#include
#include
voidprint_bit(bool*hexbit,intlen) {
inti = 0;
for(i = 0; i
printf("%x ", hexbit[i]);
}
}
voidprint_matrix(boolmatrix[8][8]) {
inti = 0;
for(i = 0; i
print_bit(matrix[i], 8);
printf("\n");
}
}
voidconvertto_bit(unsignedcharcipher,bool*hexbit,intlen) {
len = 8;
inti = 0;
for(i = 0; i
if(cipher & 0x80) {
hexbit[i] = true;
}
cipher = cipher <
}
}
voidconvertto_matrix(boolhexbit[8],boolmatrix[8][8]) {
matrix[0][0] = hexbit[0];
matrix[0][1] = hexbit[1];
matrix[0][2] = hexbit[2];
matrix[0][3] = hexbit[3];
matrix[0][4] = hexbit[0] ^ hexbit[4];
matrix[0][5] = hexbit[0] ^ hexbit[1] ^ hexbit[5];
matrix[0][6] = hexbit[1] ^ hexbit[2] ^ hexbit[6];
matrix[0][7] = hexbit[0] ^ hexbit[2] ^ hexbit[3] ^ hexbit[7];
matrix[1][0] = hexbit[1];
matrix[1][1] = hexbit[2];
matrix[1][2] = hexbit[3];
matrix[1][3] = matrix[0][4];
matrix[1][4] = matrix[0][5];
matrix[1][5] = matrix[0][6];
matrix[1][6] = hexbit[0] ^ hexbit[2] ^ hexbit[3] ^ hexbit[7];
matrix[1][7] = hexbit[1] ^ hexbit[3] ^ hexbit[4];
matrix[2][0] = hexbit[2];
matrix[2][1] = hexbit[3];
matrix[2][2] = matrix[1][3];
matrix[2][3] = matrix[1][4];
matrix[2][4] = matrix[1][5];
matrix[2][5] = matrix[1][6];
matrix[2][6] = matrix[1][7];
matrix[2][7] = hexbit[2] ^ hexbit[4] ^ hexbit[5];
matrix[3][0] = hexbit[3];
matrix[3][1] = matrix[2][2];
matrix[3][2] = matrix[2][3];
matrix[3][3] = matrix[2][4];
matrix[3][4] = matrix[2][5];
matrix[3][5] = matrix[2][6];
matrix[3][6] = matrix[2][7];
matrix[3][7] = hexbit[0] ^ hexbit[3] ^ hexbit[5] ^ hexbit[6];
matrix[4][0] = hexbit[4];
matrix[4][1] = hexbit[0] ^ hexbit[5];
matrix[4][2] = hexbit[1] ^ hexbit[6];
matrix[4][3] = hexbit[0] ^ hexbit[2] ^ hexbit[7];
matrix[4][4] = hexbit[0] ^ hexbit[1] ^ hexbit[3];
matrix[4][5] = hexbit[0] ^ hexbit[1] ^ hexbit[2] ^ hexbit[4];
matrix[4][6] = hexbit[0] ^ hexbit[1] ^ hexbit[2] ^ hexbit[3] ^ hexbit[5];
matrix[4][7] = hexbit[0] ^ hexbit[1] ^ hexbit[2] ^ hexbit[3] ^ hexbit[4]
^ hexbit[6];
matrix[5][0] = hexbit[5];
matrix[5][1] = hexbit[6];
matrix[5][2] = hexbit[0] ^ hexbit[7];
matrix[5][3] = hexbit[0] ^ hexbit[1];
matrix[5][4] = hexbit[1] ^ hexbit[2];
matrix[5][5] = hexbit[2] ^ hexbit[3];
matrix[5][6] = hexbit[0] ^ hexbit[3] ^ hexbit[4];
matrix[5][7] = hexbit[1] ^ hexbit[4] ^ hexbit[5];
matrix[6][0] = hexbit[6];
matrix[6][1] = matrix[5][2];
matrix[6][2] = matrix[5][3];
matrix[6][3] = matrix[5][4];
matrix[6][4] = matrix[5][5];
matrix[6][5] = matrix[5][6];
matrix[6][6] = matrix[5][7];
matrix[6][7] = hexbit[0] ^ hexbit[2] ^ hexbit[5] ^ hexbit[6];
matrix[7][0] = hexbit[7];
matrix[7][1] = hexbit[0];
matrix[7][2] = hexbit[1];
matrix[7][3] = hexbit[2];
matrix[7][4] = hexbit[3];
matrix[7][5] = matrix[2][2];
matrix[7][6] = matrix[2][3];
matrix[7][7] = matrix[2][4];
return;
}
unsigned charXTIME(unsignedcharx) {
return((x <
}
unsigned charmultiply(unsignedchara, unsignedcharb) {
unsigned chartemp[8] = { a };
unsigned chartempmultiply = 0x00;
inti = 0;
for(i = 1; i
temp[i] = XTIME(temp[i - 1]);
}
tempmultiply = (b & 0x01) * a;
for(i = 1; i <= 7; i++) {
tempmultiply ^= (((b >> i) & 0x01) * temp[i]);
}
returntempmultiply;
}
unsigned charmultiply_bit(unsignedcharplaintext, unsignedcharkey) {
intret_len = 0;
boolplaintext_hexbit[8] = {false,false,false,false,false,false,
false,false};
boolkey_hexbit[8] = {false,false,false,false,false,false,false,
false};
boolcipher_hexbit[8] = {false,false,false,false,false,false,false,
false};
//把plaintext转换成二进制
convertto_bit(plaintext, plaintext_hexbit, ret_len);
boolmatrix[8][8] = { };
convertto_matrix(plaintext_hexbit, matrix);
//把key转换成二进制
convertto_bit(key, key_hexbit, ret_len);
//print_matrix(matrix);
//printf("\n");
//print_bit(key_hexbit, sizeof(key_hexbit));
//printf("\n");
inti = 0;
intj = 0;
for(i = 0; i
cipher_hexbit[i] = false;
for(j = 0;j
if(key_hexbit[j]){
cipher_hexbit[i] ^=matrix[i][7-j];
}
}
}
//print_bit(cipher_hexbit, sizeof(cipher_hexbit));
unsigned charoutcome = 0;
for(i = 0; i
if(cipher_hexbit[i]) {
outcome ^= 0x01 <
}
}
returnoutcome;
}
intmain(intargc,char* argv[]) {
unsigned charplaintext = 0x49;
unsigned charkey = 0x24;
printf("%#x", multiply_bit(plaintext, key));
printf("\n");
// unsigned char plaintext1 = 0x01;
// unsigned char key1 = 0x21;
printf("%#x", multiply(plaintext, key));
return0;
}
输出结果是
结果一样,是正确的
经过测试,后一种方法比第一种方法效率慢很多,原因是其中代码计算矩阵和矩阵乘法比第一种方法复杂。但是第二种提供另外一种思路。
转载出处:http://blog.csdn.net/bupt073114/article/details/27382533
python 有限域函数库_有限域GF(2^8)内乘法代码实现以及原理相关推荐
- python 有限域函数库_深入比特币之有限域运算
这是深入比特币系列文章,主要是面向想深入理解比特币原理的开发者. 椭圆曲线加密(elliptic curve cryptography)是比特币交易工作的核心.比特币交易的签名验证离不开椭圆曲线加密. ...
- python rstrip函数_【C++实现python字符串函数库】strip、lstrip、rstrip方法
[C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...
- c int转字符串_【C++实现python字符串函数库】字符串匹配函数startswith与endswith
[C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...
- 基于TIA博途SCL语言的设备累计运行时间FB函数库_具体方法及程序示例
基于TIA博途SCL语言的设备累计运行时间FB函数库_具体方法及程序示例 如下图所示,打开博途,新建一个项目,添加一个CPU,在该CPU中,添加一个FB,命名为:设备累计运行时间, 双击打开该FB,在 ...
- python语言函数库_Python 的标准库,从0到1学Python
1.1. 介绍软件测试业务流程的梳理技巧 - 乐搏软件教育 - 软件测试 - Powered By EduSoho17lebo.com Python 的标准库包括了很多的模块, 从 Python 语 ...
- python人脸识别库_基于Python的face_recognition库实现人脸识别
Python Python开发 Python语言 基于Python的face_recognition库实现人脸识别 一.face_recognition库简介 face_recognition是Pyt ...
- c语言实现有限域模多项式_有限域计算简述
本文为理解FEC(Reed-Solomon)编码的补充,简述用到的有限域计算的知识 有限域定义 这里的域(Field)的定义是有如下特性的集合: 定义了加法和乘法 集合内的元素经过加法和乘法计算,结果 ...
- python 时间函数 毫秒_利用python进行播放音频与录音,骚操作!
现如今,我们的学习知识的渠道越来越多,我们也要充分利用自己的感官去汲取知识.当我们看书累的时候,我们完全可以听过听书来学习,这样的平台也很多,pk 哥之前也写过关于下载喜马拉雅音频爬虫的方法:Pyth ...
- python 函数式编程 库_使用Python的toolz库开始函数式编程的方法
在这个由两部分组成的系列文章的第二部分中,我们将继续探索如何将函数式编程方法中的好想法引入到 Python中,以实现两全其美. 在上一篇文章中,我们介绍了不可变数据结构 . 这些数据结构使得我们可以编 ...
- python split函数 空格_最易懂的Python新手教程:从基础语法到代码详解
导读:本文立足基础,讲解Python和PyCharm的安装,及Python最简单的语法基础和爬虫技术中所需的Python语法. 作者:罗攀 蒋仟 如需转载请联系华章科技 本文涉及的主要知识点如下: P ...
最新文章
- python基础知识点-Python基础中的29个知识点
- 虚拟实验室中的事务管理系统(一、概述)
- 解决Sqlite中的中文路径问题
- 关联查询---Mybatis学习笔记(九)
- 匈牙利算法-指派问题、二分图问题等
- 浅谈MaxCompute资源规划管理及评估
- 计算机怎么应用最小二乘法作图,最小二乘法应用
- E盾网络验证介绍以及教程分享
- matlab句柄无效怎么解决,新编MATLABSimulink自学一本通第21章 MATLAB程序编译.ppt
- 美剧之《黑客军团第四季》(Mr robot)第12集摘要
- Connect Four四子棋c++程序 - 显示窗口(0)
- 无法修改linux密码Authentication token manipulation error 问题解决
- java 向word插入图片 调整图片位置
- R绘图 第十篇:绘制散点图(高级)
- MySQL修改数据库名字
- python中max什么意思_Python
- Python-正则表达式
- 燕麦云视角:物联网安全,网络安全的杀手锏?
- 递归二分法排序---数组
- matlab亮度平衡_亮度对比度算法MATLAB实现
热门文章
- 怎样才算精通javascript
- 平板波导 matlab,非对称平板波导色散曲线求解(附matlab程序).doc
- 4款开源中文分词系统。
- 美国最受欢迎的量化交易模型有哪些吗?
- 用友java打不开_用友8.52的版本打不开UFO报表 显示UFOS MFC Application 已停止正常工作 重装软件也没用...
- vue中使用阿里巴巴矢量图标库的图标
- java防止sql注入的几个途径_Java防止SQL注入的几个途径
- 各大视频网站下载神器
- json在线解析工具
- JAVA性能分析工具--Jvisualvm使用方法