📄 streamencrypt.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 + -