密码学实验4 欧拉数求解和DES的初始置换

欧拉数求解和DES的初始置换
1、求12345的欧拉数
2、将compute转化为二进制数,并实现DES中的初始置换。

#include<iostream>
#include<cmath>
#include<string.h>
using namespace std;
int GCD(int n, int m);
int BIN(char a);
int main() {
	int ch;
	cout << "密码学实验四\n";
	cout << "请选择运行模式\n";
	cout << "1.欧拉函数\n";
	cout << "2.DES\n";
	cin >> ch;
	if (ch == 1) {
		int n, f = 0, sqn, i, t = 0, N = 0;
		cout << "请输入n=";
		cin >> n;
		sqn = sqrt(n);
		for (i = 1; i <= sqn; i++) {
			if (n % i == 0) {
				t++;
			}
		}
		if (t == 0) {
			f = n - 1;
		}
		else {
			for (i = 1; i < n; i++) {
				if (GCD(n, i) == 1) {
					f++;
				}
			}
		}
		cout << "n的欧拉数为:" << f << endl;
	}
	if (ch == 2) {
		char m[100], s[100], p, q;
		int i, j;
		int IP[8][8] = { { 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 } };
		int P0[8][8], P1[8][8];
		cout << "IP初始置换表如下:\n";
		cout << "58, 50, 42, 34, 26, 18, 10, 2,\n";
		cout << "60, 52, 44, 36, 28, 20, 12, 4,\n";
		cout << "62, 54, 46, 38, 30, 22, 14, 6,\n";
		cout << "64, 56, 48, 40, 32, 24, 16, 8,\n";
		cout << "57, 49, 41, 33, 25, 17,  9, 1,\n";
		cout << "59, 51, 43, 35, 27, 19, 11, 3,\n";
		cout << "61, 53, 45, 37, 29, 21, 13, 5,\n";
		cout << "63, 55, 47, 39, 31, 23, 15, 7\n";
		cout << "请输入明文字符串:";
		cin >> m;
		cout << "将其转化为二进制数得到下表:\n";
		for (i = 0; i < 8; i++) {
			int T = BIN(m[i]);
			for (j = 7; j >= 1; j--) {
				int t = 10;
				P0[i][j] = T % t;
				T = T / 10;
			}
		}
		for (i = 0; i < 8; i++) {
			P0[i][0] = 0;
			for (j = 0; j < 8; j++) {
				cout << P0[i][j] << " ";
			} 
			cout << endl;
		}
		cout << "进行初始置换:\n";
		for (i = 0; i < 8; i++) {
			for (j = 0; j < 8; j++) {
				p = IP[i][j] % 8;
				q = IP[i][j] / 8;
				if (p == 0) {//P0的第7列q-1行放在P1[i][j]
					P1[i][j] = P0[q - 1][7]; 
				}
				else {
					P1[i][j] = P0[q][p - 1];
				}
			}
		}
		for (i = 0; i < 8; i++) {
			for (j = 0; j < 8; j++) {
				cout << P1[i][j] << " ";
			}
			cout << endl;
		}
	}
	system("pause");
}
int GCD(int n, int m) {//判断最大公因数是不是1
	int s = 1;
	while (s != 0) {
		s = n % m;
		n = m;
		m = s;
	}
	if (n != 1)
		return 0;
	else
		return 1;
}
int BIN(char a) {//转化为二进制数
	int n = (int)a, s[100], i = 0, j;
	while (n != 0) {
		s[i] = n % 2;
		n = n / 2;
		i++;
	}
	int aim = 0, t = 1;
	for (j = 0; j < i; j++) {
		aim = aim + s[j] * t;
		//	cout << aim;
		t = t * 10;
	}
	return aim;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值