#include <string>

#pragma once

using namespace std;
class cDESUtils
{


public:
	cDESUtils(void);
	~cDESUtils(void);

private:
	/**

	 *最终置换函数 64位->64位

	 *函数说明:s为完成最后一轮循环得到的64为数据

	 *返回值为密文或明文

	 */
string final_permutation(string s);

/**

 *P盒置换函数 32位->32位

 *函数说明:s为S盒的输出

 */
string P_box(string s);

/**

 *S盒置换函数 48位->32位

 *函数说明:s为48位数据

 *返回值为32位

 */
string S_box(string s);

/**

 *异或运算函数

 *要求位数相同

 */
string XOR(string s1,string s2);

/**

 *数据扩展函数 32->48

 *函数说明:s为数据的右半部分 32位

 *扩展成48位的输出

 */
string plaintext_righthalf_extended_permutation(string s);

/**

 *密钥压缩置换函数 56位->48位

 *函数说明:s为56为的密钥

 *输出为48位的子密钥

 */
string secret_key_compression_replacement(string s);

/**

 *密钥循环左移函数 56位->56位

 *函数说明:k为左移位数 s为密钥

 *返回值位数不变

 */
string secret_ket_left_move(int k,string s);//密钥循环左移k位

/**

 *密钥初始置换函数 64位->58位

 *函数说明:s为64位的初始密钥

 *返回值为58位

 */
string secret_key_initial_permutation(string s);

/**

 *明文初始置换函数 64位->64位

 *函数说明:s为初始明文 64位

 *返回值为6位

 */
string plaintext_initial_permutation(string s);//明文初始置换

/**

 *封装函数f

 *函数说明:接收32位数据和48位的子密钥 产生一个32位的输出

 *str1:32位数据  str2:48位的子密钥

 *返回值32位

 */

string foldFunc(string str1,string str2);


string Keys[20];

public:
	/**

 *16进制转2进制函数

 *函数说明:s为16进制字符串

 *返回为2进制字符串

 */
string H(string s);

/**

 *2进制转16进制函数

 *str为2进制字符串

 *返回值为16进制字符串

 */
string G(string str);

	/**

 *子密钥生成函数

 *函数说明:s为给定的密钥

 *生成16个子密钥

 */
	void generateKeys(string s);

	/**

 *DES加密函数 64位->64位

 *函数说明:str1为64位的给定明文

 *返回值为64位的密文

 */
 string encrypt(string str1);

  /**

 *解密函数

 *str为密文

 *输出明文

 */
 string decrypt(string str);

};