⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes_tables.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
字号:
/* * aes_tables.c *  * generate tables for the AES cipher *  * David A. McGrew * Cisco Systems, Inc. *//* *	 * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  *   Redistributions of source code must retain the above copyright *   notice, this list of conditions and the following disclaimer. *  *   Redistributions in binary form must reproduce the above *   copyright notice, this list of conditions and the following *   disclaimer in the documentation and/or other materials provided *   with the distribution. *  *   Neither the name of the Cisco Systems, Inc. nor the names of its *   contributors may be used to endorse or promote products derived *   from this software without specific prior written permission. *  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */#include <stdio.h>#include "gf2_8.h"#include "crypto_math.h"unsigned char aes_sbox[256];unsigned char aes_inv_sbox[256];uint32_t T0[256], T1[256], T2[256], T3[256], T4[256]; #define AES_INVERSE_TEST 0  /* set to 1 to test forward/backwards aes *//* functions for precomputing AES values *//* * A[] is the 8 x 8 binary matrix (represented as an array of columns, * where each column is an octet) which defines the affine * transformation used in the AES substitution table (Section * 4.2.1 of the spec). */uint8_t A[8] = { 31, 62, 124, 248, 241, 227, 199, 143 };/* * b is the 8 bit vector (represented as an octet) used in the affine * transform described above. */uint8_t b = 99;voidaes_init_sbox(void) {  unsigned int i;  uint8_t x;    for (i=0; i < 256; i++) {    x = gf2_8_compute_inverse((gf2_8)i);    x = A_times_x_plus_b(A, x, b);    aes_sbox[i] = x;    aes_inv_sbox[x] = i;  }}voidaes_compute_tables(void) {  int i;  uint32_t x1, x2, x3;  v32_t tmp;  /* initialize substitution table */  aes_init_sbox();  /* combine sbox with linear operations to form 8-bit to 32-bit tables */  for (i=0; i < 256; i++) {    x1 = aes_sbox[i];    x2 = gf2_8_shift(x1);    x3 = x2 ^ x1;    tmp.v8[0] = x2;    tmp.v8[1] = x1;    tmp.v8[2] = x1;    tmp.v8[3] = x3;    T0[i] = tmp.value;    tmp.v8[0] = x3;    tmp.v8[1] = x2;    tmp.v8[2] = x1;    tmp.v8[3] = x1;    T1[i] = tmp.value;         tmp.v8[0] = x1;    tmp.v8[1] = x3;    tmp.v8[2] = x2;    tmp.v8[3] = x1;    T2[i] = tmp.value;    tmp.v8[0] = x1;    tmp.v8[1] = x1;    tmp.v8[2] = x3;    tmp.v8[3] = x2;    T3[i] = tmp.value;       }}/* * the tables U0, U1, U2, U3 implement the aes operations invSubBytes, * invMixColumns, and invShiftRows  */uint32_t U0[256], U1[256], U2[256], U3[256], U4[256];extern uint8_t aes_inv_sbox[256];voidaes_compute_inv_tables(void) {  int i;  uint8_t x, xe, x9, xd, xb;  v32_t tmp;  /* combine sbox with linear operations to form 8-bit to 32-bit tables */  for (i=0; i < 256; i++) {     x = aes_inv_sbox[i];     xe = gf2_8_multiply(0x0e, x);          x9 = gf2_8_multiply(0x09, x);          xd = gf2_8_multiply(0x0d, x);          xb = gf2_8_multiply(0x0b, x);          tmp.v8[0] = xe;     tmp.v8[1] = x9;     tmp.v8[2] = xd;     tmp.v8[3] = xb;     U0[i] = tmp.value;     tmp.v8[0] = xb;     tmp.v8[1] = xe;     tmp.v8[2] = x9;     tmp.v8[3] = xd;     U1[i] = tmp.value;          tmp.v8[0] = xd;     tmp.v8[1] = xb;     tmp.v8[2] = xe;     tmp.v8[3] = x9;     U2[i] = tmp.value;     tmp.v8[0] = x9;     tmp.v8[1] = xd;     tmp.v8[2] = xb;     tmp.v8[3] = xe;     U3[i] = tmp.value;     tmp.v8[0] = tmp.v8[1] = tmp.v8[2] = tmp.v8[3] = x;     U4[i] = tmp.value;   }}/* * aes_test_inverse() returns err_status_ok if aes * encryption and decryption are true inverses of each other, and * returns err_status_algo_fail otherwise */#include "err.h"err_status_taes_test_inverse(void);#define TABLES_32BIT 1intmain(void) {  int i;  aes_init_sbox();  aes_compute_inv_tables();#if TABLES_32BIT  printf("uint32_t U0 = {");  for (i=0; i < 256; i++) {    if ((i % 4) == 0)      printf("\n");    printf("0x%0x, ", U0[i]);  }  printf("\n}\n"); printf("uint32_t U1 = {");  for (i=0; i < 256; i++) {    if ((i % 4) == 0)      printf("\n");    printf("0x%x, ", U1[i]);  }  printf("\n}\n"); printf("uint32_t U2 = {");  for (i=0; i < 256; i++) {    if ((i % 4) == 0)      printf("\n");    printf("0x%x, ", U2[i]);  }  printf("\n}\n"); printf("uint32_t U3 = {");  for (i=0; i < 256; i++) {    if ((i % 4) == 0)      printf("\n");    printf("0x%x, ", U3[i]);  }  printf("\n}\n"); printf("uint32_t U4 = {"); for (i=0; i < 256; i++) {    if ((i % 4) == 0)      printf("\n");    printf("0x%x, ", U4[i]);  }  printf("\n}\n");#else  printf("uint32_t U0 = {");  for (i=0; i < 256; i++) {    if ((i % 4) == 0)      printf("\n");    printf("0x%lx, ", U0[i]);  }  printf("\n}\n"); printf("uint32_t U1 = {");  for (i=0; i < 256; i++) {    if ((i % 4) == 0)      printf("\n");    printf("0x%lx, ", U1[i]);  }  printf("\n}\n"); printf("uint32_t U2 = {");  for (i=0; i < 256; i++) {    if ((i % 4) == 0)      printf("\n");    printf("0x%lx, ", U2[i]);  }  printf("\n}\n"); printf("uint32_t U3 = {");  for (i=0; i < 256; i++) {    if ((i % 4) == 0)      printf("\n");    printf("0x%lx, ", U3[i]);  }  printf("\n}\n"); printf("uint32_t U4 = {"); for (i=0; i < 256; i++) {    if ((i % 4) == 0)      printf("\n");    printf("0x%lx, ", U4[i]);  }  printf("\n}\n");#endif /* TABLES_32BIT */#if AES_INVERSE_TEST  /*    * test that aes_encrypt and aes_decrypt are actually   * inverses of each other    */      printf("aes inverse test: ");  if (aes_test_inverse() == err_status_ok)    printf("passed\n");  else {    printf("failed\n");    exit(1);  }#endif    return 0;}#if AES_INVERSE_TESTerr_status_taes_test_inverse(void) {  v128_t x, y;  aes_expanded_key_t expanded_key, decrypt_key;  uint8_t plaintext[16] = {    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff   };  uint8_t key[16] = {    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f  };  v128_t k;  v128_set_to_zero(&x);    v128_copy_octet_string(&k, key);  v128_copy_octet_string(&x, plaintext);  aes_expand_encryption_key(k, expanded_key);  aes_expand_decryption_key(k, decrypt_key);  aes_encrypt(&x, expanded_key);  aes_decrypt(&x, decrypt_key);    /* compare to expected value then report */  v128_copy_octet_string(&y, plaintext);  if (v128_is_eq(&x, &y))    return err_status_ok;  return err_status_algo_fail;  } #endif 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -