c# AES加密问题

Python015

c# AES加密问题,第1张

BASE64和ascii、utf8不是一类东西。加密后的二进制代码会有很多不可见字符,经过BASE64编码后的数据仅包含0-9、a-z、A-Z、+、/这64个字符,这样保证可见。如果要查看或者保存到文本文件自然要编码为可见字符。如果你加密后直接存入二进制文件,那自然不必再转换为BASE64,直接保存即可。第二个问题,没做过

有界面,我这里有个,但是是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

/*

加密数据

byte *input 明文

byte *inSize 明文长

byte *out 密文存放的地方

byte *key 密钥key

byte *keySize 密钥长

*/

void Cipher(

unsigned char* input,

int inSize,

unsigned char* out,

unsigned char* key,

int keySize)

/*

解密数据

byte *input 密文

int *inSize 密文长

byte *out 明文存放的地方

byte *key 密钥key

int *keySize 密钥长

*/

void InvCipher(

unsigned char* input,

int inSize,

unsigned char* out,

unsigned char* key,

int keySize)

/*

生成加密用的参数AES结构

int inSize 块大小

byte* 密钥

int 密钥长

unsigned long 属性(标实类型)

返回AES结构指针

*/

AES *InitAES(AES *aes,

int inSize,

unsigned char* key,

int keySize, TYPE type)

/*

生成加密用的参数AES结构

int inSize 块大小

byte* 密钥

int 密钥长

返回AES结构指针

*/

AES *InitAES(

int inSize,

unsigned char* key,

int keySize, BOOL )

/*

加密时进行Nr轮运算

AES * aes 运行时参数

*/

void CipherLoop(

AES *aes)

/*

解密时进行Nr轮逆运算

AES * aes 运行时参数

*/

void InvCipherLoop(

AES *aes)

/*

释放AES结构和State和密钥库word

*/

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)

/*

加密数据

byte *input 明文

byte *inSize 明文长

byte *out 密文存放的地方

byte *key 密钥key

byte *keySize 密钥长

*/

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)

}

/*

解密数据

byte *input 密文

int *inSize 密文长

byte *out 明文存放的地方

byte *key 密钥key

int *keySize 密钥长

*/

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结构

int inSize 块大小

byte* 密钥

int 密钥长

返回AES结构指针

*/

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结构

int inSize 块大小

byte* 密钥

int 密钥长

返回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 = 0r <Nb++r)

{

State[r] ^= word8[r]

}

for (int round =1round {

word8 += Nb

/*

假设Nb=4

---------------------

| s0 | s1 | s2 | s3 |

---------------------

| s4 | s5 | s6 | s7 |

---------------------

| s8 | s9 | sa | sb |

---------------------

| sc | sd | se | sf |

---------------------

| | | | |

---------------------

| | | | |

---------------------

| | | | |

---------------------

*/

memcpy(State+Nb,State,12)

/*

Nb=4

---------------------

| s0 | | | |

---------------------

| s4 | s5 | | |

---------------------

| s8 | s9 | sa | |

---------------------

| sc | sd | se | sf |

---------------------

| | s1 | s2 | s3 |

---------------------

| | | s6 | s7 |

---------------------

| | | | sb |

---------------------

*/

for(r =0r {

/*

temp = {Sbox[s0],Sbox[s5],Sbox[sa],Sbox[sf]}

*/

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 =0r {

*((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++

}

}

/*

解密时进行Nr轮逆运算

AES * aes 运行时参数

*/

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 = 0r <Nb++r)

{

State[r] ^= Word[r]

}

State -= 3

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

{

/*

假设Nb=4

---------------------

| | | | |

---------------------

| | | | |

---------------------

| | | | |

---------------------

| s0 | s1 | s2 | s3 |

---------------------

| s4 | s5 | s6 | s7 |

---------------------

| s8 | s9 | sa | sb |

---------------------

| sc | sd | se | sf |

---------------------

*/

memcpy(State,State+Nb,12)

/*

Nb=4

---------------------

| | | | s7 |

---------------------

| | | sa | sb |

---------------------

| | sd | se | sf |

---------------------

| s0 | s1 | s2 | s3 |

---------------------

| s4 | s5 | s6 | |

---------------------

| s8 | s9 | | |

---------------------

| sc | | | |

---------------------

*/

Word -= Nb

State += Nb+2

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

{

/*

temp = {iSbox[s0],iSbox[sd],iSbox[sa],iSbox[s7]}

*/

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-1r >= 0r--)

{

*(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 --

}

}

/*

*--------------------------------------------

*|k0|k1|k2|k3|k4|k5|k6|k7|k8|k9|.......|Nk*4|

*--------------------------------------------

*Nr轮密钥库

*每个密钥列长度为Nb

*---------------------

*| k0 | k1 | k2 | k3 |

*---------------------

*| k4 | k5 | k6 | k7 |

*---------------------

*| k8 | k9 | ka | kb |

*---------------------

*| kc | kd | ke | kf |

*---------------------

*/

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 = Nkc <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

}

/*

释放AES结构和State和密钥库word

*/

void freeAES(AES *aes)

{

// for(int i=0iNbi++)

// {

// printf("%d\n",i)

// free(aes->State[i])

// free(aes->Word[i])

// }

// printf("sdffd")

}