之前写过SBOX的构造,后来看到别人的优秀思路,借鉴过来重新改了一点。

原文地址:http://www.cnblogs.com/7hat/p/3383546.html

主要是将矩阵运算改为列运算之和,提高了效率。

#include<iostream>
#include<fstream>
#include <iomanip>
using namespace std;
unsigned char exp[], log[], inv[];
unsigned char GFmul(unsigned char a, unsigned char b){
//GF(2^8) 乘法
unsigned char result = ;
if((b&) == )result = a;
b >>= ;
for(int i = ; i < ; i ++){
if(a > ){
a = (a << ) ^ 0x1b;
}
else{
a <<= ;
}
if((b&) == ){
result ^= a;
}
b >>= ;
}
return result;
}
void generateMulTab(){
//选择生成元3作为构造乘法表的基础
const int N = ;
exp[] = N;
log[N] = ;
unsigned char tmp = N;
for(int i = ; i < ; i ++){
tmp = GFmul(tmp, N);
exp[i] = tmp;
log[tmp] = i;
}
}
void generateMulInverse(){
//利用exp来构造乘法逆元
inv[] = ;
inv[] = ;
//若3^m * 3^n = 1 = 3^255,则 m + n = 255
for(int i = ; i < ; i ++){
inv[exp[i]] = exp[-i];
}
}
unsigned char SBoxValue(unsigned char x){
//返回SBOX对应的值
unsigned char y = inv[x];
unsigned char result = ;
unsigned char c = 0x1f; //常数矩阵的第一列
while(y){
//将矩阵运算转化为列运算之和,因为y只是一个"一维"的矩阵
if(y&){
//yi 表示是否要加上对应ci的列
result ^= c;
}
y >>= ;
//循环左移为下一列元素
c = (c<<) | (c>>);
}
result ^= 0x63;
return result;
}
int main(){
//单元测试,输出SBOX的全部值
generateMulTab();
generateMulInverse();
unsigned char SBox[][];
for(int i = ; i < ; i ++){
for(int j = ; j < ; j ++){
unsigned char tmp = i* + j;
SBox[i][j] = SBoxValue(tmp);
}
}
ofstream write("Test.txt");
for(int i = ; i < ; i ++){
for(int j = ; j < ; j ++){
write<<setiosflags(ios::left)<<setw()<<hex<<(int)SBox[i][j];
}
write<<endl;
}
write.close();
return ;
}

C++

AES的S-BOX构造优化的更多相关文章

  1. REORG TABLE命令优化数据库性能

    [转]DB2日常维护——REORG TABLE命令优化数据库性能     一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常.安全.高效运行,防止 ...

  2. DB2日常维护——REORG TABLE命令优化数据库性能

    一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常.安全.高效运行,防止一些错误重复发生. 由于DB2使用CBO作为数据库的优化器,数据库对象的状 ...

  3. DB2日常维护——REORG TABLE命令优化数据库性能(转)

    [转]DB2日常维护——REORG TABLE命令优化数据库性能 一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常.安全.高效运行,防止一些错误 ...

  4. pytorch构建优化器

    这是莫凡python学习笔记. 1.构造数据,可以可视化看看数据样子 import torch import torch.utils.data as Data import torch.nn.func ...

  5. 从结构和数字看OO——面向对象设计与构造第一章总结

    不知不觉中,我已经接触OO五周了,顺利地完成了第一章节的学习,回顾三次编程作业,惊喜于自身在设计思路和编程习惯已有了一定的改变,下面我将从度量分析.自身Bug.互测和设计模式四个方向对自己第一章的学习 ...

  6. 【转载】史上最全:TensorFlow 好玩的技术、应用和你不知道的黑科技

    [导读]TensorFlow 在 2015 年年底一出现就受到了极大的关注,经过一年多的发展,已经成为了在机器学习.深度学习项目中最受欢迎的框架之一.自发布以来,TensorFlow 不断在完善并增加 ...

  7. javascript面向对象系列第四篇——选项卡的实现

    前面的话 面向对象的应用并非只是读几本书那么容易,需要有大量的工程实践做基础才能真正理解并学会使用它.本文将用面向对象的技术来制作一个简单的选项卡 图示说明 由图示结果看到,这是一个非常简单的选项卡. ...

  8. JavaScript面向对象与原型

    工厂模式:无法识别对象 function createObject(name, age) { //集中实例化的函数 var obj = new Object(); obj.name = name; o ...

  9. JavaScript 面向对象与原型

    ECMAScript有两种开发模式:1.函数式(过程化);2.面向对象(OOP); 一 创建对象1.普通的创建对象 ? 1 2 3 4 5 6 7 8 9 // 创建一个对象,然后给这个对象新的属性和 ...

随机推荐

  1. Android -- getSystemService

    Android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,比如MountService监听是否有SD卡安装及移除,ClipboardServic ...

  2. NYOJ-129 并查集

    这个题基本上是并查集稍微一变, 只是加了一些判断条件而已,就是将点合并成树, 最后遍历一下, 统计一下有多少棵树, 如果不是1的话, 肯定不是树,所以,可以根据这个来判断 #include <s ...

  3. mui实现支付宝支付功能

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>H ...

  4. eclipse 库 library jar包 工程 总结

    引用库错误 如果在libraries中发现有小红叉,表明引用库错误 解决办法:在左侧projects中add引用到的库 如:我们的支付库引用了以下三个库 那么需要在projects中add这三个库   ...

  5. 10、第十节课jq420151012

    1.点击交替显示隐藏功能  点击交替执行的:fadeToggle(1000) , slideToggle() ,  toggle(1000);      2.点击单独执行    单独显示/隐藏:sho ...

  6. SQL 去除小数点后无效 0 的方法

     select convert(float,10.0000)  就是这么简单

  7. 一位学长的ACM总结(感触颇深)

    发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...

  8. yii2 添加模块过程

    本文以Yii2基本应用程序模板为例,介绍下向该框架下加入新模块的过程: 1. 新建模块相关目录与文件 step 1: 新建目录结构   首先在根目录下新建modules目录,然后在该目录下面添加模块目 ...

  9. Eclipse 导入项目乱码问题(中文乱码)

    1.编码不对 a.对某文件或某工程更改编码:   鼠标移到工程名或文件名,右键->Properties->Resource->Text file enCoding ->更改编码 ...

  10. 如何安装Oracle Database 11g数据库

    先选择你适合你的系统版本,32位系统的请选择32位的,64位系统可以使用32位也可以使用64位,建议采用64位的! 适用于 Microsoft Windows(32 位)的 Oracle Databa ...