在密码学中经常用到有限域的乘法,一般在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)内乘法代码实现以及原理相关推荐

  1. python 有限域函数库_深入比特币之有限域运算

    这是深入比特币系列文章,主要是面向想深入理解比特币原理的开发者. 椭圆曲线加密(elliptic curve cryptography)是比特币交易工作的核心.比特币交易的签名验证离不开椭圆曲线加密. ...

  2. python rstrip函数_【C++实现python字符串函数库】strip、lstrip、rstrip方法

    [C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...

  3. c int转字符串_【C++实现python字符串函数库】字符串匹配函数startswith与endswith

    [C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...

  4. 基于TIA博途SCL语言的设备累计运行时间FB函数库_具体方法及程序示例

    基于TIA博途SCL语言的设备累计运行时间FB函数库_具体方法及程序示例 如下图所示,打开博途,新建一个项目,添加一个CPU,在该CPU中,添加一个FB,命名为:设备累计运行时间, 双击打开该FB,在 ...

  5. python语言函数库_Python 的标准库,从0到1学Python

    1.1. 介绍软件测试业务流程的梳理技巧 - 乐搏软件教育 - 软件测试 - Powered By EduSoho​17lebo.com Python 的标准库包括了很多的模块, 从 Python 语 ...

  6. python人脸识别库_基于Python的face_recognition库实现人脸识别

    Python Python开发 Python语言 基于Python的face_recognition库实现人脸识别 一.face_recognition库简介 face_recognition是Pyt ...

  7. c语言实现有限域模多项式_有限域计算简述

    本文为理解FEC(Reed-Solomon)编码的补充,简述用到的有限域计算的知识 有限域定义 这里的域(Field)的定义是有如下特性的集合: 定义了加法和乘法 集合内的元素经过加法和乘法计算,结果 ...

  8. python 时间函数 毫秒_利用python进行播放音频与录音,骚操作!

    现如今,我们的学习知识的渠道越来越多,我们也要充分利用自己的感官去汲取知识.当我们看书累的时候,我们完全可以听过听书来学习,这样的平台也很多,pk 哥之前也写过关于下载喜马拉雅音频爬虫的方法:Pyth ...

  9. python 函数式编程 库_使用Python的toolz库开始函数式编程的方法

    在这个由两部分组成的系列文章的第二部分中,我们将继续探索如何将函数式编程方法中的好想法引入到 Python中,以实现两全其美. 在上一篇文章中,我们介绍了不可变数据结构 . 这些数据结构使得我们可以编 ...

  10. python split函数 空格_最易懂的Python新手教程:从基础语法到代码详解

    导读:本文立足基础,讲解Python和PyCharm的安装,及Python最简单的语法基础和爬虫技术中所需的Python语法. 作者:罗攀 蒋仟 如需转载请联系华章科技 本文涉及的主要知识点如下: P ...

最新文章

  1. python基础知识点-Python基础中的29个知识点
  2. 虚拟实验室中的事务管理系统(一、概述)
  3. 解决Sqlite中的中文路径问题
  4. 关联查询---Mybatis学习笔记(九)
  5. 匈牙利算法-指派问题、二分图问题等
  6. 浅谈MaxCompute资源规划管理及评估
  7. 计算机怎么应用最小二乘法作图,最小二乘法应用
  8. E盾网络验证介绍以及教程分享
  9. matlab句柄无效怎么解决,新编MATLABSimulink自学一本通第21章 MATLAB程序编译.ppt
  10. 美剧之《黑客军团第四季》(Mr robot)第12集摘要
  11. Connect Four四子棋c++程序 - 显示窗口(0)
  12. 无法修改linux密码Authentication token manipulation error 问题解决
  13. java 向word插入图片 调整图片位置
  14. R绘图 第十篇:绘制散点图(高级)
  15. MySQL修改数据库名字
  16. python中max什么意思_Python
  17. Python-正则表达式
  18. 燕麦云视角:物联网安全,网络安全的杀手锏?
  19. 递归二分法排序---数组
  20. matlab亮度平衡_亮度对比度算法MATLAB实现

热门文章

  1. 怎样才算精通javascript
  2. 平板波导 matlab,非对称平板波导色散曲线求解(附matlab程序).doc
  3. 4款开源中文分词系统。
  4. 美国最受欢迎的量化交易模型有哪些吗?
  5. 用友java打不开_用友8.52的版本打不开UFO报表 显示UFOS MFC Application 已停止正常工作 重装软件也没用...
  6. vue中使用阿里巴巴矢量图标库的图标
  7. java防止sql注入的几个途径_Java防止SQL注入的几个途径
  8. 各大视频网站下载神器
  9. json在线解析工具
  10. JAVA性能分析工具--Jvisualvm使用方法