感谢大佬666 2023-11-20 15:10 采纳率: 83%
浏览 3
已结题

想要16次过程怎么处理



#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
    char m_byte[8];
    int i;
    cout<<"请输入8字节明文:";
    cout<<endl;
    for(i=0;i<8;i++)
    {
        cin>>m_byte[i];
    }
    int m_bit[64];
    for(i=0;i<8;i++)
    {
        int j=7;
        do
        {
            m_bit[i*8+j]=m_byte[i]%2;
            m_byte[i]=m_byte[i]/2;
            j--;
        }while(m_byte[i]!=0);
        while(j>=0)
        {
            m_bit[i*8+j]=0;
            j--;
        }
    }
    int IP[64]={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 m_IP[64];
    for(i=0;i<64;i++)
        m_IP[i]=m_bit[IP[i]-1];
    int L0[32],R0[32];
    for(i=0;i<32;i++)
    {
        L0[i]=m_IP[i];
        R0[i]=m_IP[i+32];
    }
    int E[48]={32,1,2,3,4,5,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};
    int R0_E[48];
    for(i=0;i<48;i++)
    {
        R0_E[i]=R0[E[i]-1];
    }
    cout<<"请输入7字节密文:";
    cout<<endl;
    char k_byte[7];
    for(i=0;i<7;i++)
    {
        cin>>k_byte[i];
    }
    int k_bit[56];
    for(i=0;i<7;i++)
    {
        int j=7;
        do
        {
            k_bit[i*8+j]=k_byte[i]%2;
            k_byte[i]=k_byte[i]/2;
            j--;
        }while(k_byte[i]!=0);
        while(j>=0)
        {
            k_bit[i*8+j]=0;
            j--;
        }
    }
    int jo[64]={1,2,3,4,5,6,7,7,8,9,10,11,12,13,14,14,15,16,17,18,19,20,21,21,22,23,24,25,26,27,28,28,29,30,31,32,33,34,35,35,36,37,38,39,40,41,42,42,43,44,45,46,47,48,49,49,50,51,52,53,54,55,56,56};
    int k_expand[64];
    for(i=0;i<64;i++)
    {
        k_expand[i]=k_bit[jo[i]-1];
    }
    int PC_1[56]={57,49,41,33,25,17,9,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};
    int k_PC_1[56];
    for(i=0;i<56;i++)
    {
        k_PC_1[i]=k_expand[PC_1[i]-1];
    }
    int C0[28],D0[28];
    for(i=0;i<28;i++)
    {
        C0[i]=k_PC_1[i];
        D0[i]=k_PC_1[i+28];
    }
    int C1[28],D1[28],temp1=C0[0],temp2=D0[0];
    for(i=0;i<28;i++)
    {
        C1[i]=C0[i+1];
        D1[i]=D0[i+1];
    }
    C1[27]=temp1;
    D1[27]=temp2;
    int C1D1[56];
    for(i=0;i<28;i++)
    {
        C1D1[i]=C1[i];
        C1D1[i+28]=D1[i];
    }
    int PC_2[48]={14,17,11,24,1,5,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};
    int k1[48];
    for(i=0;i<48;i++)
    {
        k1[i]=C1D1[PC_2[i]-1];
    }
    int yihuo[48];
    for(i=0;i<48;i++)
    {
        if(R0_E[i]==k1[i])
            yihuo[i]=0;
        else
            yihuo[i]=1;
    }
    int s1[4][16] = { { 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, 7, 3, 10, 5, 0 },{ 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 } },
        s2[4][16] = { { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 },{ 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 },{ 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 },{ 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 } },
        s3[4][16] = { { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 },{ 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 },{ 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 },{ 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 } },
        s4[4][16] = { { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 },{ 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 },{ 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 3 },{ 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 } },
        s5[4][16] = { { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 },{ 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 },{ 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 },{ 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 } },
        s6[4][16] = { { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 },{ 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 },{ 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 },{ 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 } },
        s7[4][16] = { { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 },{ 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 },{ 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 },{ 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 } },
        s8[4][16] = { { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 },{ 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 },{ 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 },{ 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 } };
    int r,c,s,S[32];
    for(i=0;i<8;i++)
    {
        r=2*yihuo[6*i]+yihuo[6*i+5];
        c=8*yihuo[6*i+1]+4*yihuo[6*i+2]+2*yihuo[6*i+3]+yihuo[6*i+4];
        switch(i)
        {
            case 0:s=s1[r][c];break;
            case 1:s=s2[r][c];break;
            case 2:s=s3[r][c];break;
            case 3:s=s4[r][c];break;
            case 4:s=s5[r][c];break;
            case 5:s=s6[r][c];break;
            case 6:s=s7[r][c];break;
            case 7:s=s8[r][c];break;
        }
        int j=3;
        do
        {
            S[i*4+j]=s%2;
            s=s/2;
            j--;
        }while(s!=0);
        while(j>=0)
        {
            S[i*4+j]=0;
            j--;
        }
    }
    int P[32]={16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25};
    int S_P[32];
    for(i=0;i<32;i++)
    {
        S_P[i]=S[P[i]-1];
    }
    int R1[32];
    for(i=0;i<32;i++)
    {
        if(R0[i]==S_P[i])
            R1[i]=0;
        else
            R1[i]=1;
    }
    int L1[32];
    for(i=0;i<32;i++)
    {
        L1[i]=R0[i];
    }
    int c_1[64];
    for(i=0;i<32;i++)
    {
        c_1[i]=L1[i];
        c_1[i+32]=R1[i];
    }
    cout<<"第1轮加密结果为:";
    cout<<endl;
    for(i=0;i<64;i++)
    {
        cout<<c_1[i];
    }
    cout<<endl;
    system("pause");
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-20 19:15
    关注

    【相关推荐】



    • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7481404
    • 这篇博客你也可以参考下:例程16 四位数码管
    • 您还可以看一下 9316老师的数据库范式精讲课程中的 16-范式确定的窍门小节, 巩固相关知识点
    • 除此之外, 这篇博客: 16位汇编通用寄存器中的 寄存器全称 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      AH&AL=AX(accumulator):累加寄存器
      BH&BL=BX(base):基址寄存器
      CH&CL=CX(count):计数寄存器
      DH&DL=DX(data):数据寄存器
      SP(Stack Pointer):堆栈指针寄存器
      BP(Base Pointer):基址指针寄存器
      SI(Source Index):源变址寄存器
      DI(Destination Index):目的变址寄存器
      IP(Instruction Pointer):指令指针寄存器
      CS(Code Segment)代码段寄存器
      DS(Data Segment):数据段寄存器
      SS(Stack Segment):堆栈段寄存器
      ES(Extra Segment):附加段寄存器
      OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1.
      SF sign Flag 符号标志 记录运算结果的符号,结果负时为1.
      ZF zero flag 零标志 运算结果等于0时为1,否则为0.
      CF carry flag 进位标志 最高有效位产生进位时为1,否则为0.
      AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0.
      PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0.
      DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大.
      IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断.
      TF trap flag 陷阱标志 用于调试单步操作.

      在这里插入图片描述


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月8日
  • 创建了问题 11月20日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址