📄 rijindael.cpp
字号:
/*******************************************************
Rijindael (State, CipherKey)
{
KeyExpansion (CipherKey, ExpandedKey) ;
AddRoundKey (State, ExpandedKey[0]) ;
for (int i = 0; i < Nr - 1; ++i)
{
Round (State, ExpandedKey[Nr]) ;
}
FinalRound (State, ExpandedKey[Nr]) ;
}
AESencrypt (coll.begin(), coll.end(), 密钥长度, 初始密钥)
AESdecipher (coll.begin(), coll.end(), 密钥长度, 初始密钥)
如果加密和解密所选择的密钥长度不同,
或者所写的密钥不同,
将会出现未有定义的结果
Nb = 4 (分组长度/32) (分组长度位128bit)
Nk = 密钥长度/32
密钥长度对应的轮的个数
Nk = 4 时 Nr = 10
Nk = 6 时 Nr = 12
Nk = 8 时 Nr = 14
*******************************************************/
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <string>
#include "Sbox.hpp"
using namespace std ;
const int Nk = 4 ;
const int Nr = 10 ;
template <typename T> //for Nk <= 6
void KeyExpansionForShorter (T key[4][Nk], T word[4][Nb * (Nr + 1)])
{
int i = 0, j = 0 ; //循环变量
for (j = 0; j < Nk; ++j)
{
for(i = 0; i < 4; ++i)
{
word[i][j] = key[i][j] ;
}
}
for (j = Nk; j < Nb * (Nr + 1); ++j)
{
if (j % Nk == 0)
{
word[0][j] = word[0][j - Nk] ^ Sbox[word[1][j - 1]] ^ Rc[j/Nk] ;
for (i = 1; i < 4; ++i)
{
word[i][j] = word[i][j - Nk] ^ Sbox[word[(i + 1) % 4][j - 1]] ;
}
}
else
{
for (i = 0; i < 4; ++i)
{
word[i][j] = word[i][j - Nk] ^ word[i][j - 1] ;
}
}
}
}
/*
// 要求目标群集必须初始化至少 4 * (Nb * (Nr + 1)) 的空间
template <typename InputIterator, typename OutputIterator>
OutputIterator KeyExpansion (InputIterator frist, InputIterator last, OutputIterator result)
{
int i = 0, j = 0 ; // 循环变量
for (j = 0; j < Nk; ++j)
{
for (i = 0; i < 4; ++i)
{
*(result + i * Nb * (Nr + 1) + j) = * (frist + i * Nk + j) ;
}
}
/*
for (j = Nk; j < Nb * (Nr + 1); ++j)
{
if (j % Nk == 0)
{
*(result + j) = *(result + j - Nk) ^ Sbox[*(result + Nb * (Nr + 1) + j - 1)] ^ Rc[j/Nk] ;
for (i = 1; i < 4; ++i)
{
*(result + i * Nb * (Nr + 1) + j) = *(result + i * Nb * (Nr + 1) + j - Nk) ^
Sbox[*(result + ((i + 1) % 4) * Nb * (Nr + 1) + j - 1)] ^
Rc[j/Nk] ;
}
}
else
{
for (i = 0; i < 4; ++i)
{
*(result + i * Nb * (Nr + 1) + j) = *(result + i * Nb * (Nr + 1) + j - Nk) ^
*(result + i * Nb * (Nr + 1) + j - 1) ;
}
}
}
return result ;
}
*/
int main()
{
char s[4][4] = {'a','b','e','4','g','6','7','8','9','f','g','j','m','4','5','6'} ;
char ss[4][Nb * (Nr + 1)] ;
KeyExpansionForShorter (s, ss) ;
for (int j = 0; j < Nb * (Nr + 1); ++j)
{
for (int i = 0; i < 4; ++i)
{
std::cout << ss[i][j];
}
}
/* std::vector <char> coll, coll2 ;
coll.push_back ('a') ;
coll.push_back ('e') ;
coll.push_back ('i') ;
coll.push_back ('1') ;
coll.push_back ('b') ;
coll.push_back ('f') ;
coll.push_back ('j') ;
coll.push_back ('2') ;
coll.push_back ('c') ;
coll.push_back ('g') ;
coll.push_back ('k') ;
coll.push_back ('3') ;
coll.push_back ('d') ;
coll.push_back ('h') ;
coll.push_back ('l') ;
coll.push_back ('4') ;
coll2.resize (4 * (Nb * (Nr + 1))) ;
KeyExpansion (coll.begin(), coll.end(), coll2.begin()) ;
std::copy (coll2.begin(), coll2.end(), std::ostream_iterator<char>(std::cout)) ;
std::cout << std::endl ;
*/
return 0 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -