欧拉数求解和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;
}