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

📄 streamencrypt.c

📁 采用高级加密标准aes算法针对流媒体加密程序
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"rijndael.h"

    word8 mul(word8  a,word8  b){
    if (a&&b)
    return Alogtable[(Logtable[a] + Logtable[b])%255];
    else  return  0;
         }

    void AddRoundKey(word8  a[4][BC],word8  rk[4][BC])
    {
        int i,j;
        for(i=0;i<4;i++)
            for(j=0;j<BC;j++)  a[i][j]^=rk[i][j];
    }

    void SubBytes(word8  a[4][BC],word8  box[256])
    {
        int i,j;
        for(i=0;i<4;i++)
           for(j=0;j<BC;j++) a[i][j]=box[a[i][j]];
    }

    void ShiftRows(word8 a[4][BC], word8  d)
    {
        word8 tmp[BC];
        int i,j;

        if(d==0){
            for(i=1;i<4;i++){
                for(j=0;j<BC;j++)
        tmp[j]=a[i][(i+j)%BC];
        for(j=0;j<BC;j++) a[i][j]=tmp[j];
            }
        }
        else{
        for(i=1;i<4;i++){
            for (j=0;j<BC;j++)
        tmp[j]=a[i][(BC+j-i)%BC];
        for(j=0;j<BC;j++) a[i][j]=tmp[j];
        }
        }
    }

    void MixColumns(word8 a[4][BC]){
        word8  b[4][BC];
        int i,j;
        for(j=0;j<BC;j++)
        for(i=0;i<4;i++)
        b[i][j]=mul(2,a[i][j])^mul(3,a[(i+1)%4][j])^a[(i+2)%4][j]^a[(i+3)%4][j];
        for(i=0;i<4;i++)
        for(j=0;j<BC;j++)  a[i][j]=b[i][j];
      }


    void InvMixColumns(word8  a[4][BC]){
        word8  b[4][BC];
        int i,j;
        for(j=0;j<BC;j++)
        for(i=0;i<4;i++)
            b[i][j]=mul(0xe,a[i][j])^mul(0xb,a[(i+1)%4][j])
                   ^mul(0xd,a[(i+2)%4][j])^mul(0x9,a[(i+3)%4][j]);
        for(i=0;i<4;i++)
            for(j=0;j<BC;j++)  a[i][j]=b[i][j];
       }

       int KeyExpansion(word8 k[4][KC],word8 w[ROUNDS+1][4][BC]){
        int i,j,t,RCpointer=1;
        word8 tk[4][KC];
        for(j=0;j<KC;j++)
           for(i=0;i<4;i++)
               tk[i][j]=k[i][j];
        t=0;

        for(j=0;(j<KC)&&(t<(ROUNDS+1)*BC);j++,t++)
           for(i=0;i<4;i++)  w[t/BC][i][t%BC]=tk[i][j];
           while(t<(ROUNDS+1)*BC){
            for(i=0;i<4;i++)
               tk[i][0]^=S[tk[(i+1)%4][KC-1]];
               tk[0][0]^=Rc[RCpointer++];
            for(j=1;j<KC;j++)
               for(i=0;i<4;i++)  tk[i][j]^=tk[i][j-1];


           for(j=0;(j<KC)&&(t<(ROUNDS+1)*BC);j++,t++)
              for(i=0;i<4;i++)  w[t/BC][i][t%BC]=tk[i][j];
           }
           return 0;
          }

          int Encrypt(word8 a[4][BC],word8 rk[ROUNDS+1][4][BC])
          {
            int r;
            AddRoundKey(a,rk[0]);

            for(r=1;r<ROUNDS;r++){
                SubBytes(a,S);
                ShiftRows(a,0);
                MixColumns(a);
                AddRoundKey(a,rk[r]);
            }

            SubBytes(a,S);
            ShiftRows(a,0);
            AddRoundKey(a,rk[ROUNDS]);

            return 0;
          }

          int Decrypt(word8 a[4][BC],word8 rk[ROUNDS+1][4][BC])
          {
            int r;
            AddRoundKey(a,rk[ROUNDS]);
            SubBytes(a,Si);
            ShiftRows(a,1);
            for(r=ROUNDS-1;r>0;r--){
                AddRoundKey(a,rk[r]);
                InvMixColumns(a);
                SubBytes(a,Si);
                ShiftRows(a,1);
            }

            AddRoundKey(a,rk[0]);
            return 0;
          }

         void stream_encrypt(word8 * buffer1,word8 * buffer2)
         {
            int i,j,k=0,m=0,n=0;
            word8 a[4][BC],rk[ROUNDS+1][4][BC],sk[4][KC];
            word8 c[16]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'};
            for(j=0;j<KC;j++)
             {
                for(i=0;i<4;i++)
                {
                       sk[i][j]=c[k];
                       k++ ;
                }
            }			
            KeyExpansion(sk,rk);
            for(j=0;j<BC;j++)
            {
                for(i=0;i<4;i++)
                {
                    a[i][j]=* buffer1;
                    buffer1++;
                }
            }
            Encrypt(a,rk);
            for(j=0;j<BC;j++)
            {
                for(i=0;i<4;i++)
                {
                    * buffer2=a[i][j];
                    buffer2++;
                }
            }
         }

            

⌨️ 快捷键说明

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