加密解密算法代码问题

星星都碎了 2024-06-12 11:07:56

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;
}

 

输入密钥之后出现非法二进制字符是什么原因?

...全文
214 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
水の尽头 2024-07-04
  • 打赏
  • 举报
回复

出现“非法二进制字符!”的错误是因为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)。

调试代码,查看在哪个步骤出现了非法字符,并找出导致这个情况的原因。

26,911

社区成员

发帖
与我相关
我的任务
社区描述
FPGA开发者交流社区,交流FPGA应用,FPGA验证,Xilinx、Altera、Microchip、Lattice、国产高云、安路、紫光、复旦微等等。
嵌入式硬件fpga开发硬件架构 技术论坛(原bbs) 北京·朝阳区
社区管理员
  • whik1194
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧