📄 streamdecrypt.c
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"rijndael.h"
static word8 shifts[5][4]={
0,1,2,3,
0,1,2,3,
0,1,2,3,
0,1,2,4,
0,1,3,4,};
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_decrypt(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++;
}
}
Decrypt(a,rk);
for(j=0;j<BC;j++)
{
for(i=0;i<4;i++)
{
*buffer2=a[i][j];
buffer2++;
}
}
}
int main(void)
{
int i,j;
word8 m[16]=
{
146,75,179,59,112,52,100,24,240,5,128,244,12,131,112,186
};
word8 * n;
stream_decrypt(m,n);
for(i=0;i<=15;i++)
printf("%u.",n[i]);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -