密码学程序设计

密码学程序设计

实验1.Caesar(MFC对话框)

//In CaesarDlg.cpp

void CCaesarDlg::OnBnClickedButton1()
{
	unsigned char key[16]; 
	unsigned char keystream[1000]; 
	unsigned char c[1000]; 
	unsigned char m[1000]; 
	unsigned char S[256];
	unsigned char s;
	CString K;
	CString Keystream;
	CString Ciphertext;
	CString Plaintext;
	int size, keysize;
	int i, j, t;

	GetDlgItemText(IDC_EDIT1, Plaintext);
	GetDlgItemText(IDC_EDIT2, K);
	keysize = K.GetLength();
	size = Plaintext.GetLength();
	memcpy(key, K, keysize);
	memcpy(m, Plaintext, size);

	//初始化S盒
	S[0] = 100;			//防止产生'\0'
	for (i = 1; i < 256; i++)
	{
		S[i] = i;
	}

	//打乱S盒
	j = 0;
	for (i = 0; i < 256; i++)
	{
		j = (j + S[i] + key[i % keysize]) % 256;
		s = S[j]; S[j] = S[i]; S[i] = s;
	}

	//生成伪随机密钥流
	i = 0;  j = 0;
	for (t = 0; t <= size - 1; t++)
	{
		i = (i + 1) % 256;
		j = (j + S[i]) % 256;
		s = S[j]; S[j] = S[i]; S[i] = s;
		keystream[t] = S[(S[i] + S[j]) % 256];
	}

	//加密
	i = 0;
	for (t = 0; t <= size - 1; t++)
	{
		c[t] = m[t] ^ keystream[t];

		while (c[t] == 0 || keystream[t] == 0)
		{
			i++;
			keystream[t] = (keystream[t] + t + i) % 256;			
			c[t] = m[t] ^ keystream[t];
		}
	}
	/*
	//修复明文为qi35yvb9qop345y7ncq34rq039547,密钥为123456时的BUG,产生原因不明
	if (c[size] == 0xcc && keystream[size] == 0xcc)
	{
		size = size + 1;
	}
	*/
	keystream[size] = '\0';
	c[size] = '\0';
	Keystream = keystream;
	Ciphertext = c;
	SetDlgItemText(IDC_EDIT3, Keystream);
	SetDlgItemText(IDC_EDIT4, Ciphertext);
}

void CCaesarDlg::OnBnClickedButton2()
{
	//解密
	unsigned char keystream[1000];
	unsigned char c[1000];
	unsigned char m[1000];
	CString Keystream;
	CString Ciphertext;
	CString Decrytext;
	int size;
	int t;

	GetDlgItemText(IDC_EDIT3, Keystream);
	GetDlgItemText(IDC_EDIT4, Ciphertext);
	size = Keystream.GetLength();
	memcpy(keystream, Keystream, size);
	memcpy(c, Ciphertext, size);

	//解密
	for (t = 0; t <= size - 1; t++)
	{		
		m[t] = c[t] ^ keystream[t];
	}
	m[size] = '\0';
	Decrytext = m;
	SetDlgItemText(IDC_EDIT5, Decrytext);
}

实验2.RC4(MFC对话框)

//In RC4.cpp

void CRC4Dlg::OnBnClickedButton1()
{
	unsigned char key[16];
	unsigned char keystream[1000] = { 0 };
	unsigned char c[1000] = { 0 };
	unsigned char m[1000];
	unsigned char S[256];
	unsigned char s;
	CString K;
	CString Keystream;
	CString Ciphertext;
	CString Plaintext;
	int size, keysize;
	int i, j, t;

	GetDlgItemText(IDC_EDIT1, Plaintext);
	GetDlgItemText(IDC_EDIT2, K);
	keysize = K.GetLength();
	size = Plaintext.GetLength();

	memcpy(key, K, keysize);
	memcpy(m, Plaintext, size);

	//初始化S盒
	S[0] = 100;			//防止keystream中产生'\0'
	for (i = 1; i < 256; i++)
	{
		S[i] = i;
	}

	//打乱S盒
	j = 0;
	for (i = 0; i < 256; i++)
	{
		j = (j + S[i] + key[i % keysize]) % 256;
		s = S[j]; S[j] = S[i]; S[i] = s;
	}

	//生成伪随机密钥流
	i = 0;  j = 0;
	for (t = 0; t <= size; t++)
	{
		i = (i + 1) % 256;
		j = (j + S[i]) % 256;
		s = S[j]; S[j] = S[i]; S[i] = s;
		keystream[t] = S[(S[i] + S[j]) % 256];
	}

	//加密
	i = 0;
	for (t = 0; t <= size; t++)
	{
		c[t] = m[t] ^ keystream[t];

		while (c[t] == 0 || keystream[t] == 0)
		{
			i++;
			keystream[t] = (keystream[t] + i) % 256;
			c[t] = m[t] ^ keystream[t];
		}
	}
	Keystream = keystream;
	Ciphertext = c;
	SetDlgItemText(IDC_EDIT3, Keystream);
	SetDlgItemText(IDC_EDIT4, Ciphertext);
}


void CRC4Dlg::OnBnClickedButton2()
{
	//解密
	unsigned char keystream[1000];
	unsigned char c[1000];
	unsigned char m[1000] = { 0 };
	CString Keystream;
	CString Ciphertext;
	CString Decrytext;
	int size;
	int t;

	GetDlgItemText(IDC_EDIT3, Keystream);
	GetDlgItemText(IDC_EDIT4, Ciphertext);
	size = Keystream.GetLength();
	memcpy(keystream, Keystream, size);
	memcpy(c, Ciphertext, size);

	for (t = 0; t <= size - 1; t++)
	{
		m[t] = c[t] ^ keystream[t];
	}
	Decrytext = m;
	SetDlgItemText(IDC_EDIT5, Decrytext);
}


void CRC4Dlg::OnBnClickedButton3()
{
	SetDlgItemText(IDC_EDIT1, '\0');
	SetDlgItemText(IDC_EDIT2, '\0');
	SetDlgItemText(IDC_EDIT3, '\0');
	SetDlgItemText(IDC_EDIT4, '\0');
	SetDlgItemText(IDC_EDIT5, '\0');
}

实验3.DES

//In DES.cpp
#include <iostream>
#include "DES.h"
#include <memory.h>

using namespace std;

char m[1000] = { '0','1','2','3','4','5','6','7' };
char c[1000] = { 0 };
char k[9] = { '0','1','2','3','4','5','6','7','\0' };
char block[9] = { 0 };
bool b_bin[64] = { 0 };
bool k_bin[64] = { 0 };
bool k_bin1[64] = { 0 };
int size;
int ksize;
int count;

int main()
{
	//加密
	int i, j;
	
	cout << "请输入明文:" << endl;	//明文可为任意长度
	cin >> m;
	cout << "请输入64bits密钥:";
	cin >> k;
	
	int size = strlen(m);
	int count = size / 8;
	int count1 = (size + 7) / 8;
	cout << "size = " << size << "\tcount = " << count << endl;
	
	ByteToBit(k_bin, k, 64);
	SetSubKey(k_bin);

	for (i = 0; i < count1; i++)
	{
		for (j = 0; j < 8; j++)
		{
			block[j] = m[i * 8 + j];
		}
		ByteToBit(b_bin, block, 64);
		block_encrp(b_bin);
		BitToByte(b_bin, block, 64);
		for (j = 0; j < 8; j++)
		{
			c[i * 8 + j] = block[j];
		}
	}
	cout << "加密结果为:" << c << endl;
	
	char m1[1000] = { 0 };
	bool s[48] = { 0 };

	for (i = 0; i < 8; i++)
	{
		memcpy(s, SubKey[i], 48);
		memcpy(SubKey[i], SubKey[15 - i], 48);
		memcpy(SubKey[15 - i], s, 48);
	}

	for (i = 0; i < count1; i++)
	{
		for (j = 0; j < 8; j++)
		{
			block[j] = c[i * 8 + j];
		}
		ByteToBit(b_bin, block, 64);
		block_encrp(b_bin);
		BitToByte(b_bin, block, 64);
		for (j = 0; j < 8; j++)
		{
			m1[i * 8 + j] = block[j];
		}
	}
	cout << "解密后结果为:" << m1 << endl;
    return 0;
}

void ByteToBit(bool* Out, char* In, int bits)  //输入为字符In,输出的二进制位存放在Out        
{
	for (int i = 0; i < bits; i++)
	{
		Out[i] = In[i / 8] >> 7 - (i % 8) & 0x01;
		//cout << "char In[" << i / 8 << "] = " << In[i / 8] << "\tbool Out[" << i << "] = " << Out[i] << endl;
	}
}

void BitToByte(bool* In, char* Out, int bits)  //输入二进制为In,输出的字符存放在Out
{
	char Temp[8] = { 0 };
	for (int i = 0; i < bits; i++)
	{
		Temp[i / 8] |= In[i] << 7-(i % 8);
		//cout << "char Temp[" << i / 8 << "] = " << int(Temp[i / 8]) << "\tbool In[" << i << "] = " << In[i] << endl;
	}
	for (int i = 0; i < bits / 8; i++)
	{
		Out[i] = Temp[i];
	}
}

//分组加密
void block_encrp(bool* b)
{
	bool c[32] = { 0 };
	int i, j;

	Transform(b, b, IP, 64);

	//轮变换
	for (i = 0; i < 15; i++)
	{
		/*for (j = 0; j < 32; j++)
		{
			c[j] = b[j + 32];
		}*/
		memcpy(c, b + 32, 32);
		f_func(c, SubKey[i]);
		/*for (j = 0; j < 32; j++)
		{
			b[j] = b[j + 32];
			//b[j + 32] = b[j] ^ c[j];
		}*/
		Xor (c, b, 32);
		memcpy(b, b + 32, 32);
		memcpy(b + 32, c, 32);
	}
	//第16轮
	/*for (j = 0; j < 32; j++)
	{
		c[j] = b[j + 32];
	}*/
	memcpy(c, b + 32, 32);
	f_func(c, SubKey[i]);
	/*for (j = 0; j < 32; j++)
	{
		b[j] = b[j] ^ c[j];
	}*/
	Xor (b, c, 32);
	Transform(b, b, IP_Inv, 64);
}

void Transform(bool* Out, bool* In, const int* Table, int len)
{
	bool Temp[256] = { 0 };
	int j;
	for (int i = 0; i < len; i++)
	{
		j = Table[i];
		Temp[i] = In[j - 1];
		//cout << "Table[" << i << "] = " << Table[i] << "\tTemp[" << i << "] = " << Temp[i] << "\tIn[" << i << "] = " << In[i] << endl;
	}
	/*
	for (int i = 0; i < len; i++)
	{
		Out[i] = Temp[i];
		cout << "Out[" << i << "] = " << Out[i] << endl;
	}
	*/
	memcpy(Out, Temp, len);
}

void f_func(bool* In, bool* key)
{
	bool MR[48];
	Transform(MR, In, E_Table, 48);
	/*for (int i = 0; i < 48; i++)
	{
		MR[i] = MR[i] ^ key[i];
	}*/
	Xor (MR, key, 48);

	s_func(In, MR);
	Transform(In, In, P_Table, 32);
}

void SetSubKey(bool* In)
{
	Transform(In, In, PC1_Table, 56);
	cout << "k_bin-PC1 =\t" << In << endl;
	for (int i = 0; i < 16; i++)
	{
		RotateL(&In[0]);
		RotateL(&In[28]);
		Transform(SubKey[i], In, PC2_Table, 48);
		//cout << "SubKey[" << i << "] = " << SubKey[i] << endl;
		//cout << "第" << i << "轮:" << "\tk_bin = " << In << "\tSubKey = " << SubKey[i] << endl;
	}
}

void RotateL(bool* In)	//循环左移
{
	bool cpy[28] = { 0 };
	memcpy(cpy, In, 28);
	memcpy(In, cpy + 3, 25);
	memcpy(In + 25, cpy, 3);
	//cout << "RotateL\t" << In << endl;
}

void s_func(bool* Out, bool* In)
{
	int i, j, k;

	for (i = 0; i < 8; i++)
	{
		j = (In[i * 6] << 1) + (In[i * 6 + 5]);
		k = (In[i * 6 + 1] << 3) + (In[i * 6 + 2] << 2) + (In[i * 6 + 3] << 1) + (In[i * 6 + 4]);
		HalfByteToBit(Out + i * 4, &S_Box[i][j][k], 4);
	}
}

void Xor(bool* InA, bool* InB, int len)
{
	for (int i = 0; i < len; i++)
	{
		InA[i] = InB[i] ^ InA[i];
	}
}

void HalfByteToBit(bool* Out, char* In, int len)
{
	for (int i = 0; i < len; i++)
		Out[i] = (In[i / 4] >> (3 - i % 4)) & 1;
}
//In DES.h
void Xor(bool* InA, bool* InB, int len);
void ByteToBit(bool* Out, char* In, int bits);
void BitToByte(bool* In, char* Out, int bits);
void block_encrp(bool* b);
void Transform(bool* Out, bool* In, const int* Table, int len);
void f_func(bool* In, bool* key);
void SetSubKey(bool* In);
void RotateL(bool* In);
void s_func(bool* Out, bool* In);
void HalfByteToBit(bool* Out, char* In, int len);

static int IP[64] =
{
	58,50,42,34,26,18,10,2,
	60,52,44,36,28,20,12,4,
	62,54,46,38,30,22,14,6,
	64,56,48,40,32,24,16,8,
	57,49,41,33,25,17,9,1,
	59,51,43,35,27,19,11,3,
	61,53,45,37,29,21,13,5,
	63,55,47,39,31,23,15,7
};

static int IP_Inv[64] =
{
	40,8,48,16,56,24,64,32,
	39,7,47,15,55,23,63,31,
	38,6,46,14,54,22,62,30,
	37,5,45,13,53,21,61,29,
	36,4,44,12,52,20,60,28,
	35,3,43,11,51,19,59,27,
	34,2,42,10,50,18,58,26,
	33,1,41,9,49,17,57,25
};

static int PC1_Table[56] =
{
	57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,
	10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,
	63,55,47,39,31,23,15, 7,62,54,46,38,30,22,
	14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4
};

static int PC2_Table[48] =
{
	14,17,11,24, 1, 5, 3,28,15, 6,21,10,
	23,19,12, 4,26, 8,16, 7,27,20,13, 2,
	41,52,31,37,47,55,30,40,51,34,33,48,
	44,49,39,56,34,53,46,42,50,36,29,32
};

static int E_Table[48] =
{
	32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
	8, 9,10,11,12,13,12,13,14,15,16,17,
	16,17,18,19,20,21,20,21,22,23,24,25,
	24,25,26,27,28,29,28,29,30,31,32, 1
};

static int P_Table[32]
{
	16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,
	2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25
};

// 十六轮子密钥
static bool SubKey[16][48] = { 0 };

static char Move_Table[16] =
{
	1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
};

static char S_Box[8][4][16] =
{
	//S1
	14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
	0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
	4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
	15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,

	//S2
	15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
	3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
	0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
	13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,

	//S3
	10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
	13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
	13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
	1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,

	//S4
	7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
	13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
	10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
	3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,

	//S5
	2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
	14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
	4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
	11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,

	//S6
	12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
	10,15, 4, 2, 7,12, 0, 5, 6, 1,13,14, 0,11, 3, 8,
	9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
	4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13,

	//S7
	4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
	13, 0,11, 7, 4, 0, 1,10,14, 3, 5,12, 2,15, 8, 6,
	1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
	6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12,

	//S8
	13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
	1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
	7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
	2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11
};

实验4.SM4

//In SM4.cpp
#include <iostream>
#include "sm4.h"

using namespace std;
void func1(unsigned int Out[][4], char* In, int len);
void test_func1();
void test_SetRoundKey();
void test_T();
void test_L_Func();
void test_S_Func();
void test_SetPara();

int main()
{	
	cout << "请输入明文:" << endl;
	cin >> m;
	cout << "请输入128bits密钥:" << endl;
	cin >> k;

	cout << "正在生成子密钥" << endl;
	for (int i = 0; i < 16; i++)
	{
		SK[i / 4] += (k[i] << (24 - 8 * (i % 4)));
		//cout << "SK[" << i / 4 << "] = " << SK[i / 4] << "\t<-k[" << i << "]" << hex << (k[i] << (24 - 8 * (i % 4))) << endl;
	}
	SetRoundKey(SK);
	
	int size = strlen(m);
	int count = size / 16;
	int count1 = (size + 15) / 16;
	cout << "size = " << size << "\tcount = " << count << endl;
	
	//明文分组
	for (int i = 0; i < count; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			for (int k = 0; k < 4; k++)
			{
				mblock[i][j] += m[16 * i + 4 * j + k] << (24 - 8 * k);
				//cout << "m[" << 16 * i + 4 * j + k << "]" << m[16 * i + 4 * j + k] << "\tmblock[" << i << "][" << j << "]" << hex << mblock[i][j] << endl;
			}
		}
	}

	for (int j = 0; j < 4; j++)
	{
		for (int k = 0; k < 4; k++)
		{
			if (4 * j + k < size % 16)
			{
				mblock[count][j] += m[16 * (count) + 4 * j + k] << (24 - 8 * k);
				//cout << "m[" << 16 * (count) + 4 * j + k << "]" << m[16 * (count) + 4 * j + k] << "\tmblock[" << count << "][" << j << "]" << hex << mblock[count][j] << endl;
			}
		}
	}
	
	cout << "开始加密" << endl;
	for (int i = 0; i < count1; i++)
	{
		Crypt(c[i], mblock[i], RK, 1);
		for (int j = 0; j < 4; j++)
		{
			for (int k = 0; k < 4; k++)
			{
				temp = (c[i][j] >> (24 - 8 * k)) & 0xff;
				message[i*16+j*4+k] = temp;
				cout << "message["<<i*16+j*4+k<<"] = " << message[i * 16 + j * 4 + k] << endl;
			}
		}
	}
	cout << "密文为:" << c << endl;
	cout << "开始解密" << endl;
	for (int i = 0; i < count1; i++)
	{
		Crypt(mblock[i], c[i], RK, 0);
		for (int j = 0; j < 4; j++)
		{
			for (int k = 0; k < 4; k++)
			{
				temp = (mblock[i][j] >> (24 - 8 * k) & 0xff);
				message[i * 16 + j * 4 + k] = temp;
				//cout << "message[" << i * 16 + j * 4 + k << "] = " << message[i * 16 + j * 4 + k] << endl;
			}
		}
	}
	cout << "解密为:" << message << endl;
    return 0;
}

void func1(unsigned int Out[][4], char* In, int len)	//已调试完成
{
	for (int i = 0; i < 1; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			for (int k = 0; k < 4; k++)
			{
				Out[i][j] += In[16 * i + 4 * j + k] << (24 - 8 * k);
				cout << "In[" << 16 * i + 4 * j + k << "]" << In[16 * i + 4 * j + k] << "\tOut[" << i << "][" << j << "]" << hex << Out[i][j] << endl;
			}
		}
	}
}

unsigned int RotL(unsigned int In, int loop)	//调试完成
{
	//cout << "RotL Result\t" << hex << ((In << loop) | (In >> (32 - loop))) << endl;
	return (In << loop) | (In >> (32 - loop));
}

unsigned int L_Func(unsigned int In)	//调试完成
{
	unsigned int a = In ^ RotL(In, 2) ^ RotL(In, 10) ^ RotL(In, 18) ^ RotL(In, 24);
	//cout << "L_Func Result\t" << hex << a << endl;
	return a;
}

unsigned int L1_Func(unsigned int In)
{
	unsigned int a = In ^ RotL(In, 13) ^ RotL(In, 23);
	//cout << "L1_Func Result\t" << hex << a << endl;
	return a;
}

unsigned int S_Func(unsigned int In)	//已调试完成
{
	unsigned int Out = 0;
	unsigned char temp = { 0 };
	for (int i = 0; i < 4; i++)
	{
		temp = ((In >> (24 - 8 * i)) & 0xFF);
		Out = Out + (S_Box[temp] << (24 - 8 * i));
		//cout << "S_Out\t\t" << hex << Out << endl;
	}
	return Out;
}

unsigned int T(unsigned int In)	//已调试完成
{
	unsigned int a = L_Func(S_Func(In));
	//cout << "T\t\t" << a << endl;
	return a;
}

unsigned int T1(unsigned int In)
{
	unsigned int a = L1_Func(S_Func(In));
	//cout << "T1\t\t" << a << endl;
	return a;
}

void SetPara()	//生成固定参数CK	已调试完成
{
	//cout << "Running SetPara..." << endl;
	unsigned int temp = 0;
	for (int i = 0; i < 32; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			temp = (7 * (4 * i + j)) & 0xff;
			temp = temp << (24 - 8 * j);
			CK[i] = CK[i] + temp;
			//cout << "CK[" << i << "]\t" << CK[i] << endl;
		}
	}
}

void SetRoundKey(unsigned int SK[])	//传入初始密钥生成RK	已调试完成
{
	//cout << "\nRunning SetRoundKey..." << endl;
	for (int i = 0; i < 4; i++)
	{
		K[i] = SK[i] ^ FK[i];	//密钥扩展
		//cout << "K[" << i << "]" << hex << K[i] << "\tSK[" << i << "]" << hex << SK[i] << "\tFK[" << i << "]" << hex << FK[i] << endl;
	}
	//cout << endl;
	for (int i = 0; i < 32; i++)
	{
		K[i + 4] = K[i] ^ T1(K[i + 1] ^ K[i + 2] ^ K[i + 3] ^ CK[i]);
		RK[i] = K[i + 4];
		//cout << "RK[" << i << "]" << hex << RK[i] << "\tCK[" << i << "]" << hex << CK[i] << "\tK[" << i << "]" << hex << K[i] << endl << endl;
	}
}

void Crypt(unsigned int Out[4], unsigned int In[4], unsigned int RK[], bool flag)
{
	//cout << "Running Crypt..." << endl;
	unsigned int state[36] = { 0 };
	
	for (int i = 0; i < 4; i++)
	{
		state[i] = In[i];
	}
	
	//memcpy(state, In, 4);
	//cout << "state = " << state << "\tm=" << In << endl;
	for (int j = 0; j < 32; j++)
	{
		if (flag)	//加密
			state[j + 4] = state[j] ^ T(state[j + 1] ^ state[j + 2] ^ state[j + 3] ^ RK[j]);
		else
			state[j + 4] = state[j] ^ T(state[j + 1] ^ state[j + 2] ^ state[j + 3] ^ RK[31 - j]);
		//cout << "state[" << j + 4 << "] =\t" << state[j + 4] << endl;
	}
	for (int k = 0; k < 4; k++)
	{
		Out[k] = state[35 - k];
	}
}

void test_func1()
{
	cout << "Testing func1..." << endl;
	func1(mblock, m, 32);
}

void test_SetRoundKey()
{
	cout << "\nTesting SetRoundKey..." << endl;
	SetRoundKey(SK);
}

void test_S_Func()
{
	cout << "\nTesting S_Func..." << endl;
	for (int i = 0; i < 4; i++)
	{
		cout << "FK[" << i << "]" << hex << FK[i] << endl;
		unsigned int a = S_Func(FK[i]);
	}
}

void test_T()
{
	cout << "\nTestsing T..." << endl;
	unsigned int b = T(0x12345678);
}

void test_L_Func()
{
	cout << "\nTesting L_Func..." << endl;
	unsigned int b = L_Func(0x12345678);
}

void test_SetPara()
{
	cout << "Testing Setpara()..." << endl;
	SetPara();
}
//In sm4.h
char temp;
//char k[16] = { '1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6' };
//char m[16] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p' };
char k[16] = { '\0' };
char m[1000] = { '\0' };
int size, ksize;
char message[1000] = { '\0' };

unsigned int mblock[1000][4] = { 0 };//
unsigned int c[1000][4] = { 0 };
unsigned int m1[1000][4] = { 0 };

static unsigned int RK[32] = { 0 };
static unsigned int SK[4] = { 0 };
static unsigned int K[36] = { 0 };
static unsigned int CK[32] = { 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
                               0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
                               0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
                               0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 };
static unsigned int FK[4] = { 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc };

static const unsigned char S_Box[256] = {
0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05,
0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99,
0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62,
0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6,
0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8,
0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35,
0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87,
0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e,
0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1,
0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3,
0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f,
0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51,
0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8,
0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0,
0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84,
0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48,
};

unsigned int S_Func(unsigned int In);
void SetRoundKey(unsigned int SK[]);
unsigned int RotL(unsigned int In, int loop);
unsigned int T(unsigned int In);
unsigned int T1(unsigned int In);
unsigned int L_Func(unsigned int In);
unsigned int L1_Func(unsigned int In);
void Crypt(unsigned int Out[4], unsigned int In[4], unsigned int RK[], bool flag);
void SetPara(); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值