• AES加密的C语言实现


    摘抄自网络上,稍作修改。
    只能加密数据量比较小的,数据量超过一定长度存在错误。
    用16字节密钥加密,加密数据长度估计最多是txt文件的一行,64字节;也可能和文件读写方法fread/fwrite等有关,导致读出的和写入的不同。
      1 //AES
      2 
      3 #include <stdio.h>
      4 #include <string.h>
      5 #include <stdlib.h>
      6 #include <conio.h>
      7 #include <iostream>
      8 
      9 using namespace std;
     10 
     11 /*S盒*/
     12 const unsigned char s[16][16] =
     13 {
     14     0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
     15     0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
     16     0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
     17     0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
     18     0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
     19     0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
     20     0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
     21     0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
     22     0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
     23     0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
     24     0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
     25     0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
     26     0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
     27     0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
     28     0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
     29     0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
     30 };
     31 
     32 /*逆S盒*/
     33 const unsigned char inv_s[16][16] =
     34 {
     35     0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
     36     0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
     37     0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
     38     0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
     39     0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
     40     0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
     41     0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
     42     0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
     43     0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
     44     0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
     45     0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
     46     0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
     47     0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
     48     0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
     49     0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
     50     0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
     51 };
     52 
     53 /*Rcon变换*/
     54 const unsigned char Rcon[11][4] =
     55 {
     56     0x00, 0x00, 0x00, 0x00,
     57     0x01, 0x00, 0x00, 0x00,
     58     0x02, 0x00, 0x00, 0x00,
     59     0x04, 0x00, 0x00, 0x00,
     60     0x08, 0x00, 0x00, 0x00,
     61     0x10, 0x00, 0x00, 0x00,
     62     0x20, 0x00, 0x00, 0x00,
     63     0x40, 0x00, 0x00, 0x00,
     64     0x80, 0x00, 0x00, 0x00,
     65     0x1b, 0x00, 0x00, 0x00,
     66     0x36, 0x00, 0x00, 0x00
     67 };
     68 
     69 /*函数声明*/
     70 int SumBytes(FILE *fp);//1
     71 void ByteToBits(unsigned char ch, unsigned char bit[]);//2
     72 void SubBytes(unsigned char status[][4], unsigned char bit[]);//3
     73 void Inv_SubBytes(unsigned char status[][4], unsigned char bit[]);//4
     74 void ShiftRows(unsigned char status[][4]);//5
     75 void Inv_ShiftRows(unsigned char status[][4]);//6
     76 unsigned char ByteMultiply(unsigned char c);//7
     77 void MixColumns(unsigned char status[][4]);//8
     78 void Inv_MixColumns(unsigned char status[][4]);//9
     79 void RotWord(unsigned char c[], unsigned char temp[]);//10
     80 void SubWord(unsigned char temp[], unsigned char bit[]);//11
     81 void KeyExpansion(char *k, unsigned char key[][4], unsigned char bit[]);//12
     82 void RoundKeyChoice(unsigned char key[][4], unsigned char RoundKey[][4], int cnt); //13
     83 void AddRoundKey(unsigned char RoundKey[][4], unsigned char status[][4]);//14
     84 void BytesWrite(FILE *fp, unsigned char status[][4]);//15
     85 void DataEncrypt(char *k, unsigned char key[][4], unsigned char bit[], FILE *fp1, FILE *fp2, unsigned char RoundKey[][4], unsigned char status[][4]);
     86 void DataDecrypt(char *k1, unsigned char key[][4], FILE *fp1, FILE *fp2, unsigned char status[][4], unsigned char RoundKey[][4], unsigned char bit[]);
     87 
     88 /*1、计算被加密文件数据的字节数目*/
     89 int SumBytes(FILE *fp){
     90     int num = 0;
     91     char ch = fgetc(fp);
     92     while (ch != EOF){
     93         num++;
     94         ch = fgetc(fp);
     95     }
     96     return num;
     97 }
     98 
     99 /*2、字节转换为二进制位存放在数组中*/
    100 void ByteToBits(unsigned char ch, unsigned char bit[]){
    101     for (int i = 0; i < 8; i++)
    102         bit[i] = (ch >> i) & 1;
    103 }
    104 
    105 /*3、S盒变换*/
    106 void SubBytes(unsigned char status[][4], unsigned char bit[]){
    107     for (int i = 0; i < 4; i++)
    108     for (int j = 0; j < 4; j++){
    109         ByteToBits(status[i][j], bit);
    110         status[i][j] = s[(bit[7] * 8 + bit[6] * 4 + bit[5] * 2 + bit[4])][(bit[3] * 8 + bit[2] * 4 + bit[1] * 2 + bit[0])];
    111     }
    112 }
    113 
    114 /*4、逆S盒变换*/
    115 void Inv_SubBytes(unsigned char status[][4], unsigned char bit[]){
    116     for (int i = 0; i < 4; i++)
    117     for (int j = 0; j < 4; j++){
    118         ByteToBits(status[i][j], bit);
    119         status[i][j] = inv_s[(bit[7] * 8 + bit[6] * 4 + bit[5] * 2 + bit[4])][(bit[3] * 8 + bit[2] * 4 + bit[1] * 2 + bit[0])];
    120     }
    121 }
    122 
    123 /*5、行变换*/
    124 void ShiftRows(unsigned char status[][4]){
    125     unsigned char temp1 = status[1][0];
    126     unsigned char temp2 = status[2][0];
    127     unsigned char temp3 = status[2][1];
    128     unsigned char temp4 = status[3][0];
    129     unsigned char temp5 = status[3][1];
    130     unsigned char temp6 = status[3][2];
    131     for (int i = 0; i < 3; i++)
    132         status[1][i] = status[1][(i + 1)];
    133     status[1][3] = temp1;
    134     for (int i = 0; i < 2; i++)
    135         status[2][i] = status[2][(i + 2)];
    136     status[2][2] = temp2;
    137     status[2][3] = temp3;
    138     status[3][0] = status[3][3];
    139     status[3][1] = temp4;
    140     status[3][2] = temp5;
    141     status[3][3] = temp6;
    142 }
    143 
    144 /*6、逆行变换*/
    145 void Inv_ShiftRows(unsigned char status[][4]){
    146     unsigned char temp1 = status[1][3];
    147     unsigned char temp2 = status[2][2];
    148     unsigned char temp3 = status[2][3];
    149     unsigned char temp4 = status[3][1];
    150     for (int i = 3; i > 0; i--)
    151         status[1][i] = status[1][i - 1];
    152     status[1][0] = temp1;
    153     for (int i = 3; i > 1; i--)
    154         status[2][i] = status[2][i - 2];
    155     status[2][0] = temp2;
    156     status[2][1] = temp3;
    157     for (int i = 1; i < 4; i++)
    158         status[3][i] = status[3][(i + 1) % 4];
    159     status[3][0] = temp4;
    160 }
    161 
    162 /*7、列变换被调用函数x乘法(02乘法)*/
    163 unsigned char ByteMultiply(unsigned char c){
    164     unsigned char temp;
    165     temp = c << 1;
    166     if (c & 0x80){
    167         temp ^= 0x1b;
    168     }
    169     return temp;
    170 }
    171 
    172 /*8、列变换*/
    173 void MixColumns(unsigned char status[][4]){
    174     unsigned char temp[4][4];
    175     for (int j = 0; j < 4; j++)
    176     for (int i = 0; i < 4; i++)
    177         temp[i][j] = ByteMultiply(status[i % 4][j]) //0x02乘法
    178         ^ (status[(i + 1) % 4][j] ^ ByteMultiply(status[(i + 1) % 4][j])) //0x03乘法
    179         ^ status[(i + 2) % 4][j]  //0x01乘法
    180         ^ status[(i + 3) % 4][j]; //0x01乘法
    181     for (int i = 0; i < 4; i++)
    182     for (int j = 0; j < 4; j++)
    183         status[i][j] = temp[i][j];
    184 }
    185 
    186 /*9、逆列变换*/
    187 void Inv_MixColumns(unsigned char status[][4]){
    188     unsigned char temp[4][4];
    189     for (int j = 0; j< 4; j++)
    190     for (int i = 0; i<4; i++)
    191         temp[i][j] = (ByteMultiply(ByteMultiply(ByteMultiply(status[i % 4][j]))) ^ ByteMultiply(ByteMultiply(status[i % 4][j])) ^ ByteMultiply(status[i % 4][j])) //0x0E乘法
    192         ^ (ByteMultiply(ByteMultiply(ByteMultiply(status[(i + 1) % 4][j]))) ^ ByteMultiply(status[(i + 1) % 4][j]) ^ status[(i + 1) % 4][j]) //0x0B乘法
    193         ^ (ByteMultiply(ByteMultiply(ByteMultiply(status[(i + 2) % 4][j]))) ^ ByteMultiply(ByteMultiply(status[(i + 2) % 4][j])) ^ status[(i + 2) % 4][j]) //0x0D乘法
    194         ^ (ByteMultiply(ByteMultiply(ByteMultiply(status[(i + 3) % 4][j]))) ^ status[(i + 3) % 4][j]); //0x09乘法
    195     for (int i = 0; i < 4; i++)
    196     for (int j = 0; j < 4; j++)
    197         status[i][j] = temp[i][j];
    198 }
    199 
    200 /*10、位置变换*/
    201 void RotWord(unsigned char c[], unsigned char temp[]){
    202     for (int i = 1; i < 4; i++)
    203         temp[i - 1] = c[i];
    204     temp[3] = c[0];
    205 }
    206 
    207 /*11、小S盒变换*/
    208 void SubWord(unsigned char temp[], unsigned char bit[]){
    209     for (int i = 0; i < 4; i++){
    210         ByteToBits(temp[i], bit);
    211         temp[i] = s[(bit[7] * 8 + bit[6] * 4 + bit[5] * 2 + bit[4])][(bit[3] * 8 + bit[2] * 4 + bit[1] * 2 + bit[0])];
    212     }
    213 }
    214 
    215 /*12、密钥扩展函数*/
    216 void KeyExpansion(char *k, unsigned char key[][4], unsigned char bit[]){
    217     int i, j;
    218     unsigned char temp[4];
    219     for (i = 0; i < 44; i++)
    220     for (j = 0; j < 4; j++){
    221         if (i < 4) key[i][j] = *(k + 4 * i + j);
    222         else if ((i != 0) && (i % 4 == 0)){
    223             RotWord(key[i - 1], temp);
    224             SubWord(temp, bit);
    225             key[i][j] = key[i - 4][j] ^ temp[j] ^ Rcon[i / 4][j];
    226         }
    227         else  key[i][j] = key[i - 1][j] ^ key[i - 4][j];
    228     }
    229 }
    230 
    231 /*13、从扩展密钥中选择轮密钥的函数*/
    232 void RoundKeyChoice(unsigned char key[][4], unsigned char RoundKey[][4], int cnt){
    233     int cnt1 = 4 * cnt;
    234     for (int i = 0; i < 4; i++){
    235         for (int j = 0; j < 4; j++){
    236             RoundKey[i][j] = key[cnt1][j];
    237         }
    238         cnt1++;
    239     }
    240 }
    241 
    242 /*14、与扩展密钥的异或运算*/
    243 void AddRoundKey(unsigned char RoundKey[][4], unsigned char status[][4]){
    244     for (int j = 0; j < 4; j++)
    245     for (int i = 0; i < 4; i++)
    246         status[i][j] = status[i][j] ^ RoundKey[j][i];
    247 }
    248 
    249 /*15、将状态矩阵中的字节写入文件中函数*/
    250 void BytesWrite(FILE *fp, unsigned char status[][4]){
    251     char ch;
    252     for (int i = 0; i < 4; i++)
    253     for (int j = 0; j < 4; j++){
    254         ch = status[i][j];
    255         fputc(ch, fp);
    256     }
    257 }
    258 
    259 /*16.加密总函数*/
    260 void DataEncrypt(char *k, unsigned char key[][4], unsigned char bit[], FILE *fp1, FILE *fp2, unsigned char RoundKey[][4], unsigned char status[][4]) {
    261     int sum, numOfBlock, numOfSurplus;
    262     char ch;
    263     int len = strlen(k);
    264     if (len != 16){
    265         free(k);
    266         printf("
    
    输入密钥长度不满足要求!
    "); return;
    267     }
    268     KeyExpansion(k, key, bit);
    269     sum = SumBytes(fp1);
    270     fp1 = fopen("源文件.txt", "r");
    271     numOfBlock = sum / 16;
    272     numOfSurplus = sum % 16;
    273     ch = fgetc(fp1);
    274     /*第一种情况*/
    275     if (numOfBlock != 0 && numOfSurplus == 0){
    276         for (int n = 1; n <= numOfBlock; n++){
    277             for (int i = 0; i < 4; i++)
    278             for (int j = 0; j < 4; j++){
    279                 status[i][j] = ch;
    280                 ch = fgetc(fp1);
    281             }//status赋值 
    282             RoundKeyChoice(key, RoundKey, 0);
    283             AddRoundKey(RoundKey, status);
    284             for (int nr = 1; nr <= 10; nr++){
    285                 SubBytes(status, bit);
    286                 ShiftRows(status);
    287                 MixColumns(status);
    288                 RoundKeyChoice(key, RoundKey, nr);
    289                 AddRoundKey(RoundKey, status);
    290             }//10轮加密
    291             SubBytes(status, bit);
    292             ShiftRows(status);
    293             RoundKeyChoice(key, RoundKey, 4);
    294             AddRoundKey(RoundKey, status);
    295             BytesWrite(fp2, status);
    296         }//Block循环
    297     }//if
    298     //第二种情况
    299     else if (numOfBlock == 0 && numOfSurplus != 0){
    300         for (int i = 0; i < 4; i++)
    301         for (int j = 0; j < 4; j++){
    302             if (ch == EOF) break;
    303             status[i][j] = ch;
    304             ch = fgetc(fp1);
    305         }
    306         for (int i = sum / 4; i < 4; i++)
    307         for (int j = sum % 4; j < 4; j++)
    308             status[i][j] = 0x00;
    309         RoundKeyChoice(key, RoundKey, 0);
    310         AddRoundKey(RoundKey, status);
    311         for (int nr = 1; nr <= 10; nr++){
    312             SubBytes(status, bit);
    313             ShiftRows(status);
    314             MixColumns(status);
    315             RoundKeyChoice(key, RoundKey, nr);
    316             AddRoundKey(RoundKey, status);
    317         }//10轮加密
    318         SubBytes(status, bit);
    319         ShiftRows(status);
    320         RoundKeyChoice(key, RoundKey, 4);
    321         AddRoundKey(RoundKey, status);
    322         BytesWrite(fp2, status);
    323     }//else if
    324     //第三种情况
    325     else if (numOfBlock != 0 && numOfSurplus != 0){
    326         for (int n = 1; n <= numOfBlock; n++){
    327             for (int i = 0; i <4; i++)
    328             for (int j = 0; j < 4; j++){
    329                 status[i][j] = ch;
    330                 ch = fgetc(fp1);
    331             }//status赋值 
    332             RoundKeyChoice(key, RoundKey, 0);
    333             AddRoundKey(RoundKey, status);
    334             for (int nr = 1; nr <= 10; nr++){
    335                 SubBytes(status, bit);
    336                 ShiftRows(status);
    337                 MixColumns(status);
    338                 RoundKeyChoice(key, RoundKey, nr);
    339                 AddRoundKey(RoundKey, status);
    340             }//10轮加密
    341             SubBytes(status, bit);
    342             ShiftRows(status);
    343             RoundKeyChoice(key, RoundKey, 4);
    344             AddRoundKey(RoundKey, status);
    345             BytesWrite(fp2, status);
    346         }//Block循环
    347         for (int i = 0; i < 4; i++)
    348         for (int j = 0; j < 4; j++){
    349             if (ch == EOF) break;
    350             status[i][j] = ch;
    351             ch = fgetc(fp1);
    352         }
    353         for (int i = sum / 4; i < 4; i++)
    354         for (int j = sum % 4; j < 4; j++)
    355             status[i][j] = 0x00;
    356         RoundKeyChoice(key, RoundKey, 0);
    357         AddRoundKey(RoundKey, status);
    358         for (int nr = 1; nr <= 10; nr++){
    359             SubBytes(status, bit);
    360             ShiftRows(status);
    361             MixColumns(status);
    362             RoundKeyChoice(key, RoundKey, nr);
    363             AddRoundKey(RoundKey, status);
    364         }//10轮加密
    365         SubBytes(status, bit);
    366         ShiftRows(status);
    367         RoundKeyChoice(key, RoundKey, 4);
    368         AddRoundKey(RoundKey, status);
    369         BytesWrite(fp2, status);
    370     }//else 
    371     free(k);
    372     fclose(fp1);
    373     fclose(fp2);
    374     printf("
    
    加密文件成功!
    
    ");
    375 }
    376 
    377 /*17.解密总函数*/
    378 void DataDecrypt(char *k1, unsigned char key[][4], FILE *fp1, FILE *fp2, unsigned char status[][4], unsigned char RoundKey[][4], unsigned char bit[]) {
    379     int numOfBlock, sum;
    380     char ch;
    381     int len = strlen(k1);
    382     if (len != 16){
    383         free(k1);
    384         printf("
    
    输入密钥长度不满足要求!
    "); return;
    385     }
    386     sum = SumBytes(fp1);
    387     fp1 = fopen("加密后文件.txt", "r");
    388     numOfBlock = sum / 16;
    389     ch = fgetc(fp1);
    390     for (int i = 1; i <= numOfBlock; i++){
    391         for (int i = 0; i < 4; i++)
    392         for (int j = 0; j < 4; j++){
    393             status[i][j] = ch;
    394             ch = fgetc(fp1);
    395         }
    396         RoundKeyChoice(key, RoundKey, 4);
    397         AddRoundKey(RoundKey, status);
    398         Inv_ShiftRows(status);
    399         Inv_SubBytes(status, bit);
    400         for (int nr = 10; nr >= 1; nr--){
    401             RoundKeyChoice(key, RoundKey, nr);
    402             AddRoundKey(RoundKey, status);
    403             Inv_MixColumns(status);
    404             Inv_ShiftRows(status);
    405             Inv_SubBytes(status, bit);
    406         }//10轮解密 
    407         RoundKeyChoice(key, RoundKey, 0);
    408         AddRoundKey(RoundKey, status);
    409         BytesWrite(fp2, status);
    410     }//Block
    411     free(k1);
    412     fclose(fp1);
    413     fclose(fp2);
    414     printf("
    
    解密文件成功!
    
    ");
    415 }
    416 
    417 int main(){
    418     int choice, sum1;
    419     int flag = 1;
    420     char *k, *k1;
    421     FILE *fp1, *fp2;
    422     unsigned char status[4][4] = { 0x00 };
    423     unsigned char key[44][4] = { 0x00 };
    424     unsigned char RoundKey[4][4] = { 0x00 };
    425     unsigned char bit[8] = { 0x00 };
    426     do{
    427         printf("*****************************AES加密解密文件************************************");
    428         printf("
    ");
    429         printf("                             1.加密文件
    
    ");
    430         printf("                             2.解密文件
    
    ");
    431         printf("                             3.退出
    
    ");
    432         printf("
    请选择要进行的操作:");
    433         scanf("%d", &choice);
    434         switch (choice){
    435         case 1: fp1 = fopen("源文件.txt", "r");
    436             if (fp1 == NULL){
    437                 printf("打开源文件失败!
    ");
    438                 getchar();
    439                 exit(0);
    440             }
    441             fp2 = fopen("加密后文件.txt", "w");
    442             if (fp2 == NULL){
    443                 printf("打开加密后文件失败!
    ");
    444                 getchar();
    445                 exit(0);
    446             }
    447             printf("
    请输入加密密钥(128bit):");
    448             k = (char *)malloc(20 * sizeof(char));
    449             cin >> k;
    450             DataEncrypt(k, key, bit, fp1, fp2, RoundKey, status);
    451             break;
    452         case 2: fp1 = fopen("加密后文件.txt", "r");
    453             if (fp1 == NULL){
    454                 printf("
    打开加密后文件失败!
    ");
    455                 getchar();
    456                 exit(0);
    457             }
    458             fp2 = fopen("解密后文件.txt", "w");
    459             if (fp2 == NULL){
    460                 printf("
    打开解密后文件失败!
    ");
    461                 getchar();
    462                 exit(0);
    463             }
    464             printf("
    
    请输入解密密钥(128bit):");
    465             k1 = (char *)malloc(20 * sizeof(char));
    466             cin >> k1;
    467             DataDecrypt(k1, key, fp1, fp2, status, RoundKey, bit);
    468             break;
    469         case 3: flag = 0; break;
    470         default: printf("
    
    所选操作不合法!
    ");
    471         }//switch
    472     } while (flag);
    473 }
    C Code
  • 相关阅读:
    Stanford NLP 课程笔记之计算字符串距离
    Stanford NLP 课堂笔记之正则表达式
    最长回文子串
    java面向对象
    java中数组的定义
    AtCoder Beginner Contest 100 C(思维)
    Codeforces 1000B Light It Up(思维)
    jq的链式调用.end();
    解决css中display:inline-block的兼容问题
    解决css中display:inline-block产生的空隙问题
  • 原文地址:https://www.cnblogs.com/starf/p/3657546.html
Copyright © 2020-2023  润新知