aes-cfb.c
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:5k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /**
  2.  * AES library with built-in CFB support.
  3.  *
  4.  * Copyright (c) 2006, Hongli Lai
  5.  * All rights reserved.
  6.  *
  7.  * Parts of this software are based on AESCrypt
  8.  * http://aescrypt.sourceforge.net/
  9.  * Copyright 1999,2000 Enhanced Software Technologies Inc.
  10.  *
  11.  * Redistribution and use in source and binary forms, with or without
  12.  * modification, are permitted provided that the following conditions are met:
  13.  *
  14.  * - Redistributions of source code must retain the above copyright notice,
  15.  *   this list of conditions and the following disclaimer.
  16.  * - Redistributions in binary form must reproduce the above copyright notice,
  17.  *   this list of conditions and the following disclaimer in the documentation
  18.  *   and/or other materials provided with the distribution.
  19.  * - Neither the name of copyright holders nor the names of its contributors
  20.  *   may be used to endorse or promote products derived from this software
  21.  *   without specific prior written permission.
  22.  *
  23.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  24.  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26.  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  27.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  28.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  29.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  30.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  31.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  32.  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  33.  * POSSIBILITY OF SUCH DAMAGE.
  34.  * #########################################################################
  35.  * Mandatory attribution clauses:
  36.  * This software includes MD5 routines copyrighted by RSA Data Security, Inc.
  37.  * #########################################################################
  38.  */
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41. #include "aes-cfb.h"
  42. #include "rijndael-api-fst.h"
  43. #ifdef __cplusplus
  44. extern "C" {
  45. #endif
  46. struct AES_Struct {
  47. cipherInstance cipher;
  48. int cfb128_idx;  /* where we are in the CFB128 cfb_blk). */
  49. int key_gen;     /* a flag for whether we're keyed or not... */
  50. keyInstance encrypt_key;
  51. keyInstance decrypt_key;
  52. u8 cfb_blk[16];
  53. u8 cfb_crypt[16];
  54. };
  55. AES_Struct *
  56. AES_Create() {
  57. AES_Struct *aes;
  58. aes = (AES_Struct *) malloc(sizeof(AES_Struct));
  59. if (aes != NULL) {
  60. cipherInit(&aes->cipher, MODE_ECB, NULL);
  61. aes->cfb128_idx = -1;
  62. aes->key_gen = 0;
  63. }
  64. return aes;
  65. }
  66. /**
  67.  * Convert a decimal number to a hexadecimal one.
  68.  *
  69.  * @require 0 <= val <= 15
  70.  */
  71. static unsigned char
  72. hex(unsigned char val) {
  73. if (val < 10) {
  74. return '0' + val;
  75. } else {
  76. return 'a' + val - 10;
  77. }
  78. }
  79. /**
  80.  * Convert a byte string to hexadecimal.
  81.  *
  82.  * @param str     The string to convert.
  83.  * @param len     The size of the string.
  84.  * @param result  The string to store the hexadecimal result to.
  85.  * @require
  86.  *     str != NULL
  87.  *     result != NULL
  88.  *     result must be at least len*2 bytes.
  89.  * @ensure
  90.  *     The result is exactly len*2 bytes.
  91.  */
  92. static void
  93. str_to_hex(const unsigned char *str, unsigned int len, unsigned char *result) {
  94. unsigned int i;
  95. for (i = 0; i < len; i++) {
  96. result[i * 2] = hex(str[i] >> 4);
  97. result[i * 2 + 1] = hex(str[i] & 0xF);
  98. }
  99. }
  100. void
  101. AES_SetKey(AES_Struct *aes, const unsigned char *key, unsigned int key_len) {
  102. unsigned char hexkey[64];
  103. if (key_len != 16 && key_len != 24 && key_len != 32) {
  104. fprintf(stderr, "AES_SetKey: key must be 128, 192 or 256 bits.n");
  105. abort();
  106. }
  107. str_to_hex(key, key_len, hexkey);
  108. makeKey(&aes->encrypt_key, DIR_ENCRYPT, key_len * 8, (char *) hexkey);
  109. makeKey(&aes->decrypt_key, DIR_DECRYPT, key_len * 8, (char *) hexkey);
  110. aes->key_gen = 1;
  111. }
  112. void
  113. AES_SetSalt(AES_Struct *aes, const unsigned char *salt) {
  114. unsigned int i;
  115. unsigned char *dest;
  116. aes->cfb128_idx = -1;
  117. dest = aes->cfb_blk;
  118. for (i = 0; i < AES_SALT_SIZE; i++) {
  119. *dest = *salt;
  120. dest++;
  121. salt++;
  122. }
  123. }
  124. void
  125. AES_Encrypt(AES_Struct *aes, const unsigned char *data, unsigned int len,
  126.     unsigned char *result) {
  127. unsigned int i, ch;
  128. for (i = 0; i < len; i++) {
  129. if ((aes->cfb128_idx < 0) || (aes->cfb128_idx > 15)) {
  130. blockEncrypt(&aes->cipher, &aes->encrypt_key,
  131.      aes->cfb_blk, 128, aes->cfb_crypt);
  132. aes->cfb128_idx = 0;
  133. }
  134. /* XOR the data with a byte from our encrypted buffer. */ 
  135. ch = data[i] ^ aes->cfb_crypt[aes->cfb128_idx];
  136. /* do output feedback: put crypted byte into next block to be crypted */
  137. aes->cfb_blk[aes->cfb128_idx] = ch;
  138. aes->cfb128_idx++;
  139. result[i] = (unsigned char) ch;
  140. }
  141. }
  142. void
  143. AES_Decrypt(AES_Struct *aes, const unsigned char *data, unsigned int len,
  144.     unsigned char *result) {
  145. unsigned int i, ch;
  146. for (i = 0; i < len; i++) {
  147. if (aes->cfb128_idx < 0 || aes->cfb128_idx > 15) {
  148. blockEncrypt(&aes->cipher, &aes->encrypt_key,
  149.      aes->cfb_blk, 128, aes->cfb_crypt);
  150. aes->cfb128_idx = 0;
  151. }
  152. ch = data[i];
  153. result[i] = ch ^ aes->cfb_crypt[aes->cfb128_idx]; 
  154. /* do output feedback: put crypted byte into next block to be crypted */
  155. aes->cfb_blk[aes->cfb128_idx] = ch;
  156. aes->cfb128_idx++;
  157. }
  158. }
  159. void
  160. AES_Free(AES_Struct *aes) {
  161. free(aes);
  162. }
  163. #ifdef __cplusplus
  164. }
  165. #endif