26,911
社区成员




int main()
{
/**
*初始条件
**/
/* 输入明文MingWen(十六进制),密钥Key(十六进制) */
string MingWen ;
string Key;
cout<<"Welcome to DES encryption system! "<<endl;
cout<<"Please enter MingWen: "<<endl;
cin>>MingWen;
cout<<"Please enter your Key: "<<endl;
cin>>Key;
string M = hexToTwo(MingWen);
string K = hexToTwo(Key);
/**
*处理密钥,生成16个子密钥 *
*/
/* 利用规则交换表(8*7)将K转换成 K0
K0(56位) = C0(28位) + D0(28位) */
string KKK = exchange(K, ExchangeRules, ExchangeRules_SIZE);
/* 利用移位表转换得C1D1----C16D16,存入K_arr */
int i = 0;
string K_arr[Key_SIZE+1];
K_arr[0] = KKK;
for(i=1; i<=Key_SIZE; i++){
K_arr[i] = spiltShift(K_arr[i-1], ShiftTable[i-1]);
}
/* Kn(48位)= PC-2(8*6)处理 CnDn得16个子密钥,存入Key_arr */
string Key_arr[Key_SIZE];
for(i=0; i<Key_SIZE; i++){
Key_arr[i] = exchange(K_arr[i+1], PC_2, PC_2_SIZE);
}
/**
* 用子密钥对明文加密
**/
/* 通过IP(8*8)处理M得L0(32位) R0(32位) */
string IP_M = exchange(M, IP, IP_SIZE);
/* Ln= R(n-1); Rn= L(n-1) + f(R(n- 1); Kn)迭代16次 */
string L[Key_SIZE+1];
string R[Key_SIZE+1];
L[0] = IP_M.substr(0, M.length()/2);
R[0] = IP_M.substr(M.length()/2);
string it = "";
for(i=1; i<=Key_SIZE; i++){
//将R0通过扩展置换E(8*6)从32位扩展到48位
it = exchange(R[i-1], E, E_SIZE);
//R0(48位)与 K1异或得E0(48位)
it = XOR(it, Key_arr[i-1]);
//将E0(48位)通过S盒转换成32位
it = SBoxWork(it, SBox);
//P盒(8*4)置换,得P0
it = exchange(it, P, P_SIZE);
//P0与L0进行异或,得J0
it = XOR(it, L[i-1]);
//左右交换位置,即R1 = J0; L1 = R0
L[i] = R[i-1];
R[i] = it;
}
/* 对R16 L16进行一次IP-1(8*8)排序得密文 */
string res = "";
res += R[16];
res += L[16];
string finalRes = Bin2Hex(exchange(res, IP_1, IP_1_SIZE));
cout<<"DES encryption results are as follows: "<<endl;
cout<<finalRes<<endl;
return 0;
}
/**
*int转四位string + int十进制转string二进制
**/
string int2BinString(int n) {
bitset<4> bit(n);
return bit.to_string();
}
/**
*string十六进制转string二进制
**/
string hexToTwo(string str){
string twoBin = "";
int i;
for(i=0; i<16; i++){
if(str[i]>='0'&&str[i]<='9')
twoBin.append(int2BinString(str[i]));
else if(str[i]>='A'&&str[i]<='Z')
twoBin.append(int2BinString(str[i]-'A'+10));
else if(str[i]>='a'&&str[i]<='z')
twoBin.append(int2BinString(str[i]-'a'+10));
}
return twoBin;
}
/**
* string二进制转int十进制
**/
int binToDec(string bin){
int sum = 0;
for(int i=0; i<bin.size(); i++){
if(bin[i]=='0' || bin[i]=='1'){
sum += (bin[i]-'0') * pow(2, bin.size()-i-1);
}else{
cout<<"非法二进制字符!"<<endl;
return 0;
}
}
return sum;
}
输入密钥之后出现非法二进制字符是什么原因?
出现“非法二进制字符!”的错误是因为binToDec函数在检查输入字符串时发现了非二进制字符。这个函数的目的是将二进制字符串转换为十进制整数,因此它只接受字符'0'和'1'作为有效输入。
错误发生在binToDec函数的循环中:
for(int i=0; i<bin.size(); i++){
if(bin[i]=='0' || bin[i]=='1'){
// ...
}else{
cout<<"非法二进制字符!"<<endl;
return 0;
}
}
在您提供的代码中,出现“非法二进制字符!”的错误是因为binToDec函数在检查输入字符串时发现了非二进制字符。这个函数的目的是将二进制字符串转换为十进制整数,因此它只接受字符'0'和'1'作为有效输入。
错误发生在binToDec函数的循环中:
for(int i=0; i<bin.size(); i++){
if(bin[i]=='0' || bin[i]=='1'){
// ...
}else{
cout<<"非法二进制字符!"<<endl;
return 0;
}
}
for(int i=0; i<bin.size(); i++){
if(bin[i]=='0' || bin[i]=='1'){
// ...
}else{
cout<<"非法二进制字符!"<<endl;
return 0;
}
}
当bin[i]不是'0'或'1'时,函数会输出错误信息并返回0。这通常意味着在调用binToDec函数时传递的字符串包含了一个或多个非二进制字符。
为了找出问题所在,你需要检查以下几点:
确保hexToTwo函数正确地将十六进制字符串转换为二进制字符串,没有添加或遗漏任何字符。
检查MingWen和Key变量的输入是否仅包含有效的十六进制字符(0-9 和 A-F/a-f)。
调试代码,查看在哪个步骤出现了非法字符,并找出导致这个情况的原因。