永发信息网

求AES加解/密码密软件程序!!!

答案:1  悬赏:0  手机版
解决时间 2021-12-04 12:47
求AES加解/密码密软件程序!!!
最佳答案
有界面,我这里有个,但是是c#语言的,你以为如何?
下面是c版本的
AES加密算法源代码
//AES.h

#define decrypt TRUE
#define encrypt FALSE
#define TYPE BOOL

typedef struct _AES{
int Nb;
int Nr;
int Nk;
unsigned long *Word;
unsigned long *State;
}AES;


void Cipher(
unsigned char* input,
int inSize,
unsigned char* out,
unsigned char* key,
int keySize);


void InvCipher(
unsigned char* input,
int inSize,
unsigned char* out,
unsigned char* key,
int keySize);


AES *InitAES(AES *aes,
int inSize,
unsigned char* key,
int keySize, TYPE type);


AES *InitAES(
int inSize,
unsigned char* key,
int keySize, BOOL );


void CipherLoop(
AES *aes);

void InvCipherLoop(
AES *aes);


void freeAES(
AES *aes);

//AES.cpp

#include "stdafx.h"
#include
#include
#include "AES.h"
unsigned char* SubWord(unsigned char* word);
unsigned long* keyExpansion(unsigned char* key, int Nk, int Nr,int);

void Cipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize)
{
AES aes ;
InitAES(&aes,inSize,key,keySize,encrypt);

memcpy(aes.State,input,inSize);
CipherLoop(&aes);
memcpy(out,aes.State,inSize);

}


void InvCipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize)
{
AES aes;
InitAES(&aes,inSize,key,keySize,decrypt);
memcpy(aes.State,input,inSize);
InvCipherLoop(&aes);
memcpy(aes.State,out,inSize);
}


AES *InitAES(AES *aes,int inSize, unsigned char *key, int keySize, TYPE type)
{
int Nb = inSize >>2,
Nk = keySize >>2,
Nr = Nb < Nk ? Nk:Nb+6;
aes->Nb = Nb;
aes->Nk = Nk;
aes->Nr = Nr;
aes->Word = keyExpansion(key,Nb,Nr,Nk);

aes->State = new unsigned long[Nb+3];
if(type)
aes->State += 3;
return aes;
}


AES *InitAES(int inSize, unsigned char* key, int keySize,unsigned long type)
{
return InitAES(new AES(),inSize,key,keySize,type);
}

void CipherLoop(AES *aes)
{
unsigned char temp[4];
unsigned long *word8 = aes->Word,
*State = aes->State;

int Nb = aes->Nb,
Nr = aes->Nr;

int r;
for (r = 0; r < Nb; ++r)
{
State[r] ^= word8[r];
}
for (int round =1; round {
word8 += Nb;

memcpy(State+Nb,State,12);

for(r =0; r {

temp[0] = Sbox[*((unsigned char*)State)];
temp[1] = Sbox[*((unsigned char*)(State+1)+1)];
temp[2] = Sbox[*((unsigned char*)(State+2)+2)];
temp[3] = Sbox[*((unsigned char*)(State+3)+3)];

*((unsigned char*)State) = Log_02[temp[0]] ^ Log_03[temp[1]] ^ temp[2] ^ temp[3];
*((unsigned char*)State+1) = Log_02[temp[1]] ^ Log_03[temp[2]] ^ temp[3] ^ temp[0];
*((unsigned char*)State+2) = Log_02[temp[2]] ^ Log_03[temp[3]] ^ temp[0] ^ temp[1];
*((unsigned char*)State+3) = Log_02[temp[3]] ^ Log_03[temp[0]] ^ temp[1] ^ temp[2];

*State ^= word8[r];
State++;
}
State -= Nb;
}

memcpy(State+Nb,State,12);

word8 += Nb;
for(r =0; r {
*((unsigned char*)State) = Sbox[*(unsigned char*)State];
*((unsigned char*)State+1) = Sbox[*((unsigned char*)(State+1)+1)];
*((unsigned char*)State+2) = Sbox[*((unsigned char*)(State+2)+2)];
*((unsigned char*)State+3) = Sbox[*((unsigned char*)(State+3)+3)];

*State ^= word8[r];
State++;
}
}

void InvCipherLoop(AES *aes)
{
unsigned long *Word = aes->Word,
*State = aes->State;

int Nb = aes->Nb,
Nr = aes->Nr;

unsigned char temp[4];

int r =0;
Word += Nb*Nr;
for (r = 0; r < Nb; ++r)
{
State[r] ^= Word[r];
}

State -= 3;

for (int round = Nr-1; round > 0; --round)
{

memcpy(State,State+Nb,12);


Word -= Nb;
State += Nb+2;

for(r = Nb-1; r >= 0; r--)
{

temp[0] = iSbox[*(byte*)State];
temp[1] = iSbox[*((byte*)(State-1)+1)];
temp[2] = iSbox[*((byte*)(State-2)+2)];
temp[3] = iSbox[*((byte*)(State-3)+3)];

*(unsigned long*)temp ^= Word[r];

*(unsigned char*)State = Log_0e[temp[0]] ^ Log_0b[temp[1]] ^ Log_0d[temp[2]] ^ Log_09[temp[3]];
*((unsigned char*)State+1) = Log_0e[temp[1]] ^ Log_0b[temp[2]] ^ Log_0d[temp[3]] ^ Log_09[temp[0]];
*((unsigned char*)State+2) = Log_0e[temp[2]] ^ Log_0b[temp[3]] ^ Log_0d[temp[0]] ^ Log_09[temp[1]];
*((unsigned char*)State+3) = Log_0e[temp[3]] ^ Log_0b[temp[0]] ^ Log_0d[temp[1]] ^ Log_09[temp[2]];

State --;
}
State -= 2;
}

Word -= Nb;
memcpy(State,State+Nb,12);

State += Nb+2;
for(r = Nb-1; r >= 0; r--)
{

*(unsigned char*)State = iSbox[*(unsigned char*)State];
*((unsigned char*)State+1) = iSbox[*((unsigned char*)(State-1)+1)];
*((unsigned char*)State+2) = iSbox[*((unsigned char*)(State-2)+2)];
*((unsigned char*)State+3) = iSbox[*((unsigned char*)(State-3)+3)];

*State ^= Word[r];
State --;
}
}

unsigned long* keyExpansion(byte* key, int Nb, int Nr, int Nk)
{
unsigned long *w =new unsigned long[Nb * (Nr+1)]; // 4 columns of bytes corresponds to a word

memcpy(w,key,Nk<<2);
unsigned long temp;

for (int c = Nk; c < Nb * (Nr+1); ++c)
{
//把上一轮的最后一行放入temp
temp = w[c-1];
//判断是不是每一轮密钥的第一行
if (c % Nk == 0)
{
//左旋8位
temp = (temp<<8)|(temp>>24);
//查Sbox表
SubWord((byte*)&temp);
temp ^= Rcon[c/Nk];
}
else if ( Nk > 6 && (c % Nk == 4) )
{
SubWord((byte*)&temp);
}
//w[c-Nk] 为上一轮密钥的第一行
w[c] = w[c-Nk] ^ temp;
}
return w;
}

unsigned char* SubWord(unsigned char* word)
{
word[0] = Sbox[ word[0] ];
word[1] = Sbox[ word[1] ];
word[2] = Sbox[ word[2] ];
word[3] = Sbox[ word[3] ];
return word;
}

void freeAES(AES *aes)
{
// for(int i=0;iNb;i++)
// {
// printf("%d\n",i);
// free(aes->State[i]);
// free(aes->Word[i]);
// }
// printf("sdffd");
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
单选题下列活动中不属于实践活动的是A.张某对
东北家常黑白菜怎么做如何做好吃
犒劳 拾掇 健硕 近义词
咖啡的名称与意义
蜂蜜真的能够去除脸部老年斑吗
用历、厉、励分别造句
请问在PE装系统这是什么意思?
四川绵阳香辣酱做法及配方
是不是所有的循环小数都可以用分数表示?那0.
一人举着两个旗各写着一个国一个德字猜成语
小闸口村地址在哪,我要去那里办事,
立普妥和阿乐有什么区别
请教和田玉籽料与岫玉河磨玉的区别
为什么网上说吴世勋不穿内裤啊?是不是真的啊
日本歌曲男女合唱。抱字开头后面是日文。开始
推荐资讯
开封有没有定做西服的,好点的,最好是有电话
失恋被同事嘲笑!!!
那里有收二手电脑的急出
皂液怎么做
霍尔木兹海峡那么小,外面海面那么宽,为什么一
电脑上无法显示U盘的盘符
编写一个带参数的main函数(用C语言编写),
单反柔焦如何设置?
招行手机银行的钱怎么转到恒生银行账户?招行
东明县公安局城区派出所办公地址在什么地方?
护士注册时要学历验证吗
娄沈台村委会地址在哪?我要去那里办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?