⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decode.c

📁 DSP系統設計和BIOS編程及應用實例-書籍光碟範例-第10章
💻 C
📖 第 1 页 / 共 2 页
字号:
    
 b3[5]=a3[1]+a3[6]+a3[7]+a0[0]+a0[1]+a0[5]+a0[6]+a1[1]+a1[5]+a1[7]+a2[0]+a2[1]
+a2[5];
    
 b3[6]=a3[2]+a3[7]+a0[0]+a0[1]+a0[2]+a0[6]+a0[7]+a1[0]+a1[2]+a1[6]+a2[1]+a2[2]
+a2[6];
    
 b3[7]=a3[0]+a3[1]+a3[2]+a0[0]+a0[2]+a0[7]+a1[1]+a1[2]+a1[7]+a2[2]+a2[7];

     for(k=0;k<8;k++)
        {a0[k]=b0[k]%2;
         a1[k]=b1[k]%2;
         a2[k]=b2[k]%2;
         a3[k]=b3[k]%2;
        }

     sum=0;
     for(k=0;k<8;k++)
         sum=sum+a0[k]*(int)pow(2,7-k);
     *(*(pinfo+0)+j)=sum;

     sum=0;
     for(k=0;k<8;k++)
         sum=sum+a1[k]*(int)pow(2,7-k);
     *(*(pinfo+1)+j)=sum;

     sum=0;
     for(k=0;k<8;k++)
         sum=sum+a2[k]*(int)pow(2,7-k);
     *(*(pinfo+2)+j)=sum;

     sum=0;
     for(k=0;k<8;k++)
         sum=sum+a3[k]*(int)pow(2,7-k);
     *(*(pinfo+3)+j)=sum;
    }
}

void InvAddRoundKey(int (*pinfo)[Nb],int (*pRoundKey)[Nb*N+Nb],int
 round)
{int i,j,k;
 int temp,sum;
 for(i=0;i<4;i++)
     for(j=0;j<Nb;j++)
        {sum=0;
         for(k=0;k<8;k++)
          
  {if((*(*(pinfo+i)+j)/(int)pow(2,k))%2!=((*(*(pRoundKey+i)+round*Nb+j)/(int)
pow(2,k))%2))
                temp=1;
             else
                temp=0;
             sum=sum+temp*(int)pow(2,k);
            }
         *(*(pinfo+i)+j)=sum;
        }
}

void KeyExpansion(int (*pKey_Original)[Nk],int (*pRoundKey)[N*Nb+Nb])  
                                
{int i,j,k;                                                            
                                
 int sum,temp;                                                        
                                 
 int a[8]={0,0,0,0,0,0,0,1};                                          
                                 
 int b[8]={0,0,0,0,0,0,0,0};                                          
                                 
 int RC[(N*Nb+Nb-1)/Nk+1];                                            
                                 
 RC[1]=1;                                                              
                                
 for(j=0;j<Nk;j++)                                                    
                                 
     for(i=0;i<4;i++)                                                  
                                
         *(*(pRoundKey+i)+j)=*(*(pKey_Original+i)+j);                  
                                
                                                                      
                                 
 for(j=2;j<(N*Nb+Nb-1)/Nk+1;j++)                                      
                                 
    {b[0]=a[1];                                                        
                                
     b[1]=a[2];                                                        
                                
     b[2]=a[3];                                                        
                                
     b[3]=a[0]+a[4];                                                  
                                 
     b[4]=a[0]+a[5];                                                  
                                 
     b[5]=a[6];                                                        
                                
     b[6]=a[0]+a[7];                                                  
                                 
     b[7]=a[0];                                                        
                                
                                                                      
                                 
     sum=0;                                                            
                                
     for(k=0;k<8;k++)                                                  
                                
        {a[k]=b[k]%2;                                                  
                                
         sum=sum+a[k]*(int)pow(2,7-k);                                
                                 
        }                                                              
                                
     RC[j]=sum;                                                        
                                
    }                                                                  
                                
                                                                      
                                 
 for(j=Nk;j<N*Nb+Nb;j++)                                              
                                 
    {if(j%4!=0)                                                        
                                
       {for(i=0;i<4;i++)                                              
                                 
           {sum=0;                                                    
                                 
            for(k=0;k<8;k++)                                          
                                 
              
 {if((*(*(pRoundKey+i)+j-1)/(int)pow(2,k))%2!=((*(*(pRoundKey+i)+j-4)/(int)pow
(2,k))%2)) 
                   temp=1;                                            
                                 
                else                                                  
                                 
                   temp=0;                                            
                                 
                sum=sum+temp*(int)pow(2,k);                            
                                
               }                                                      
                                 
            *(*(pRoundKey+i)+j)=sum;                                  
                                 
           }                                                          
                                 
      }                                                                
                                
                                                                      
                                 
     if(j%4==0)                                                        
                                
        {for(i=0;i<4;i++)                                              
                                
             *(*(pRoundKey+i)+j)=*(*(pRoundKey+i)+j-1);                
                                
                                                                      
                                 
         temp=*(*(pRoundKey+0)+j);                                    
                                 
         for(i=0;i<4;i++)                                              
                                
             *(*(pRoundKey+i)+j)=*(*(pRoundKey+i+1)+j);                
                                
         *(*(pRoundKey+3)+j)=temp;                                    
                                 
                                                                      
                                 
         for(i=0;i<4;i++)                                              
                                
             *(*(pRoundKey+i)+j)=SearchSbox(*(*(pRoundKey+i)+j));      
                                
                                                                      
                                 
         sum=0;                                                        
                                
         for(k=0;k<8;k++)                                              
                                
          
  {if((*(*(pRoundKey+0)+j)/(int)pow(2,k))%2!=((RC[j/Nk]/(int)pow(2,k))%
2))                   
                temp=1;                                                
                                
             else                                                      
                                
                temp=0;                                                
                                
             sum=sum+temp*(int)pow(2,k);                              
                                 
            }                                                          
                                
         *(*(pRoundKey+0)+j)=sum;                                      
                                
                                                                      
                                 
         for(i=1;i<4;i++)                                              
                                
            {sum=0;                                                    
                                
             for(k=0;k<8;k++)                                          
                                
                {if((*(*(pRoundKey+i)+j)/(int)pow(2,k))%2==1)          
                                
                    temp=1;                                            
                                
                 else                                                  
                                
                    temp=0;                                            
                                
                 sum=sum+temp*(int)pow(2,k);                          
                                 
                }                                                      
                                
             *(*(pRoundKey+i)+j)=sum;                                  
                                
            }                                                          
                                
                                                                      
                                 
         for(i=0;i<4;i++)                                              
                                
            {sum=0;                                                    
                                
             for(k=0;k<8;k++)                                          
                                
              
  {if((*(*(pRoundKey+i)+j)/(int)pow(2,k))%2!=((*(*(pRoundKey+i)+j-Nk)/(int)pow
(2,k))%2)) 
                    temp=1;                                            
                                
                 else                                                  
                                
                    temp=0;                                            
                                
                 sum=sum+temp*(int)pow(2,k);                          
                                 
                }                                                      
                                
             *(*(pRoundKey+i)+j)=sum;                                  
                                
            }                                                          
                                
        }                                                              
                                
       }                                                              
                                 
}/*密钥扩展*/  
int SearchSbox(int info)
{int tens,ones,temp_tens,temp_ones;
 tens=info/16;
 ones=info%16;
 temp_tens=upper_sbox[tens][ones];
 temp_ones=lower_sbox[tens][ones];
 info=temp_tens*16+temp_ones;
 return (info);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -