#include <iostream>
#include<bitset>
#include<string>
using namespace std;
void leftmov(string &r) //左移函数
{
bitset<28> bits1(r,0,28);
bitset<28> bits2(r,0,1);
bitset<28> bits3(r,28,28);
bitset<28> bits4(r,28,1);
bits1 = bits1<<1;
bits3 = bits3<<1;
bits1 = bits2|bits1;
bits3 = bits3|bits4;
r = bits1.to_string() +bits3.to_string();
}
void xor(string &r1,string &r2) //f函数内异或函数
{
bitset<48> m1(r1);
bitset<48> m2(r2);
m2 = m1^m2;
r2 = m2.to_string();
}
void xor2(string &r3,string &r4) //左右32位异或函数
{
bitset<32> m3(r3);
bitset<32> m4(r4);
m4 = m3^m4;
r4 = m4.to_string();
}
void ox_to_b(string &ppx,string &ppz) //16进制字符串转换2进制函数
{ string ppl[16];
for(int zz = 0;zz<16;zz++) ppl[zz] ='0000';
for(int cv = 0;cv<16;cv++)
{
switch(ppx[cv]){
case '0': ppl[cv] = "0000";break;
case '1': ppl[cv] = "0001";break;
case '2': ppl[cv] = "0010";break;
case '3': ppl[cv] = "0011";break;
case '4': ppl[cv] = "0100";break;
case '5': ppl[cv] = "0101";break;
case '6': ppl[cv] = "0110";break;
case '7': ppl[cv] = "0111";break;
case '8': ppl[cv] = "1000";break;
case '9': ppl[cv] = "1001";break;
case 'A': ppl[cv] = "1010";break;
case 'a': ppl[cv] = "1010";break;
case 'B': ppl[cv] = "1011";break;
case 'b': ppl[cv] = "1011";break;
case 'C': ppl[cv] = "1100";break;
case 'c': ppl[cv] = "1100";break;
case 'D': ppl[cv] = "1101";break;
case 'd': ppl[cv] = "1101";break;
case 'E': ppl[cv] = "1110";break;
case 'e': ppl[cv] = "1110";break;
case 'F': ppl[cv] = "1111";break;
default: ppl[cv] = "1111";break;}
}
ppz = ppl[0] +ppl[1]+ppl[2]+ppl[3]+ppl[4]+ppl[5]+ppl[6]+ppl[7]+ppl[8]+ppl[9]+ppl[10]+ppl[11]+ppl[12]+ppl[13]+ppl[14]+ppl[15];
}//2017.3.30
void main()
//0011000100110010001100110011010000110101001101100011011100111000(64位密钥)
//3132333435363738(16)
//0011000000110001001100100011001100110100001101010011011000110111(64位明文)
//3031323334353637(16)
//1000101110110100011110100000110011110000101010010110001001101101(64位密文)
//以上是实验数
{
unsigned int z1[56] = { 57,49,41,33,25,17,9, //置换选择1表
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};
unsigned int z2[48] = {14,17,11,24,1,5, //置换选择2表
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,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};
unsigned int cirs[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; //左移位数表
unsigned int ip[64] = {58,50,42,34,26,18,10,2, //初始置换IP表
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,};
unsigned int xip[64] = {40,8,48,16,56,24,64,32, //逆初始置换IP表
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};
unsigned int xe[48] = {32,1,2,3,4,5, //选择运算E表
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};
//s盒表
unsigned int sbox[16][64] = {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
#include<bitset>
#include<string>
using namespace std;
void leftmov(string &r) //左移函数
{
bitset<28> bits1(r,0,28);
bitset<28> bits2(r,0,1);
bitset<28> bits3(r,28,28);
bitset<28> bits4(r,28,1);
bits1 = bits1<<1;
bits3 = bits3<<1;
bits1 = bits2|bits1;
bits3 = bits3|bits4;
r = bits1.to_string() +bits3.to_string();
}
void xor(string &r1,string &r2) //f函数内异或函数
{
bitset<48> m1(r1);
bitset<48> m2(r2);
m2 = m1^m2;
r2 = m2.to_string();
}
void xor2(string &r3,string &r4) //左右32位异或函数
{
bitset<32> m3(r3);
bitset<32> m4(r4);
m4 = m3^m4;
r4 = m4.to_string();
}
void ox_to_b(string &ppx,string &ppz) //16进制字符串转换2进制函数
{ string ppl[16];
for(int zz = 0;zz<16;zz++) ppl[zz] ='0000';
for(int cv = 0;cv<16;cv++)
{
switch(ppx[cv]){
case '0': ppl[cv] = "0000";break;
case '1': ppl[cv] = "0001";break;
case '2': ppl[cv] = "0010";break;
case '3': ppl[cv] = "0011";break;
case '4': ppl[cv] = "0100";break;
case '5': ppl[cv] = "0101";break;
case '6': ppl[cv] = "0110";break;
case '7': ppl[cv] = "0111";break;
case '8': ppl[cv] = "1000";break;
case '9': ppl[cv] = "1001";break;
case 'A': ppl[cv] = "1010";break;
case 'a': ppl[cv] = "1010";break;
case 'B': ppl[cv] = "1011";break;
case 'b': ppl[cv] = "1011";break;
case 'C': ppl[cv] = "1100";break;
case 'c': ppl[cv] = "1100";break;
case 'D': ppl[cv] = "1101";break;
case 'd': ppl[cv] = "1101";break;
case 'E': ppl[cv] = "1110";break;
case 'e': ppl[cv] = "1110";break;
case 'F': ppl[cv] = "1111";break;
default: ppl[cv] = "1111";break;}
}
ppz = ppl[0] +ppl[1]+ppl[2]+ppl[3]+ppl[4]+ppl[5]+ppl[6]+ppl[7]+ppl[8]+ppl[9]+ppl[10]+ppl[11]+ppl[12]+ppl[13]+ppl[14]+ppl[15];
}//2017.3.30
void main()
//0011000100110010001100110011010000110101001101100011011100111000(64位密钥)
//3132333435363738(16)
//0011000000110001001100100011001100110100001101010011011000110111(64位明文)
//3031323334353637(16)
//1000101110110100011110100000110011110000101010010110001001101101(64位密文)
//以上是实验数
{
unsigned int z1[56] = { 57,49,41,33,25,17,9, //置换选择1表
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};
unsigned int z2[48] = {14,17,11,24,1,5, //置换选择2表
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,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};
unsigned int cirs[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; //左移位数表
unsigned int ip[64] = {58,50,42,34,26,18,10,2, //初始置换IP表
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,};
unsigned int xip[64] = {40,8,48,16,56,24,64,32, //逆初始置换IP表
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};
unsigned int xe[48] = {32,1,2,3,4,5, //选择运算E表
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};
//s盒表
unsigned int sbox[16][64] = {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