⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rijindael.cpp

📁 是密码学加减密中中的重要算法
💻 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 + -