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

📄 safer.c

📁 该压缩包中包括 tom的加密函数库及pdf说明 ,以及Rinick s ECC:椭圆曲线非对称加密密钥生成器
💻 C
📖 第 1 页 / 共 2 页
字号:
/* LibTomCrypt, modular cryptographic library -- Tom St Denis * * LibTomCrypt is a library that provides various cryptographic * algorithms in a highly modular and flexible manner. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org *//********************************************************************************* FILE:           safer.c** DESCRIPTION:    block-cipher algorithm SAFER (Secure And Fast Encryption*                 Routine) in its four versions: SAFER K-64, SAFER K-128,*                 SAFER SK-64 and SAFER SK-128.** AUTHOR:         Richard De Moliner (demoliner@isi.ee.ethz.ch)*                 Signal and Information Processing Laboratory*                 Swiss Federal Institute of Technology*                 CH-8092 Zuerich, Switzerland** DATE:           September 9, 1995** CHANGE HISTORY:********************************************************************************/#include <tomcrypt.h>#ifdef SAFERconst struct ltc_cipher_descriptor    safer_k64_desc = {   "safer-k64",    8, 8, 8, 8, SAFER_K64_DEFAULT_NOF_ROUNDS,   &safer_k64_setup,   &safer_ecb_encrypt,   &safer_ecb_decrypt,   &safer_k64_test,   &safer_done,   &safer_64_keysize,   NULL, NULL, NULL, NULL, NULL, NULL, NULL   },   safer_sk64_desc = {   "safer-sk64",   9, 8, 8, 8, SAFER_SK64_DEFAULT_NOF_ROUNDS,   &safer_sk64_setup,   &safer_ecb_encrypt,   &safer_ecb_decrypt,   &safer_sk64_test,   &safer_done,   &safer_64_keysize,   NULL, NULL, NULL, NULL, NULL, NULL, NULL   },   safer_k128_desc = {   "safer-k128",   10, 16, 16, 8, SAFER_K128_DEFAULT_NOF_ROUNDS,   &safer_k128_setup,   &safer_ecb_encrypt,   &safer_ecb_decrypt,   &safer_sk128_test,   &safer_done,   &safer_128_keysize,   NULL, NULL, NULL, NULL, NULL, NULL, NULL   },   safer_sk128_desc = {   "safer-sk128",   11, 16, 16, 8, SAFER_SK128_DEFAULT_NOF_ROUNDS,   &safer_sk128_setup,   &safer_ecb_encrypt,   &safer_ecb_decrypt,   &safer_sk128_test,   &safer_done,   &safer_128_keysize,   NULL, NULL, NULL, NULL, NULL, NULL, NULL   };/******************* Constants ************************************************//* #define TAB_LEN      256  *//******************* Assertions ***********************************************//******************* Macros ***************************************************/#define ROL8(x, n)   ((unsigned char)((unsigned int)(x) << (n)\                                     |(unsigned int)((x) & 0xFF) >> (8 - (n))))#define EXP(x)       safer_ebox[(x) & 0xFF]#define LOG(x)       safer_lbox[(x) & 0xFF]#define PHT(x, y)    { y += x; x += y; }#define IPHT(x, y)   { x -= y; y -= x; }/******************* Types ****************************************************/extern const unsigned char safer_ebox[], safer_lbox[];#ifdef LTC_CLEAN_STACKstatic void _Safer_Expand_Userkey(const unsigned char *userkey_1,                                 const unsigned char *userkey_2,                                 unsigned int nof_rounds,                                 int strengthened,                                 safer_key_t key)#elsestatic void Safer_Expand_Userkey(const unsigned char *userkey_1,                                 const unsigned char *userkey_2,                                 unsigned int nof_rounds,                                 int strengthened,                                 safer_key_t key)#endif{   unsigned int i, j, k;    unsigned char ka[SAFER_BLOCK_LEN + 1];    unsigned char kb[SAFER_BLOCK_LEN + 1];    if (SAFER_MAX_NOF_ROUNDS < nof_rounds)        nof_rounds = SAFER_MAX_NOF_ROUNDS;    *key++ = (unsigned char)nof_rounds;    ka[SAFER_BLOCK_LEN] = (unsigned char)0;    kb[SAFER_BLOCK_LEN] = (unsigned char)0;    k = 0;    for (j = 0; j < SAFER_BLOCK_LEN; j++) {        ka[j] = ROL8(userkey_1[j], 5);        ka[SAFER_BLOCK_LEN] ^= ka[j];        kb[j] = *key++ = userkey_2[j];        kb[SAFER_BLOCK_LEN] ^= kb[j];    }    for (i = 1; i <= nof_rounds; i++) {        for (j = 0; j < SAFER_BLOCK_LEN + 1; j++) {            ka[j] = ROL8(ka[j], 6);            kb[j] = ROL8(kb[j], 6);        }        if (strengthened) {           k = 2 * i - 1;           while (k >= (SAFER_BLOCK_LEN + 1)) { k -= SAFER_BLOCK_LEN + 1; }        }        for (j = 0; j < SAFER_BLOCK_LEN; j++) {            if (strengthened) {                *key++ = (ka[k]                                + safer_ebox[(int)safer_ebox[(int)((18 * i + j + 1)&0xFF)]]) & 0xFF;                if (++k == (SAFER_BLOCK_LEN + 1)) { k = 0; }            } else {                *key++ = (ka[j] + safer_ebox[(int)safer_ebox[(int)((18 * i + j + 1)&0xFF)]]) & 0xFF;            }        }        if (strengthened) {           k = 2 * i;           while (k >= (SAFER_BLOCK_LEN + 1)) { k -= SAFER_BLOCK_LEN + 1; }        }        for (j = 0; j < SAFER_BLOCK_LEN; j++) {            if (strengthened) {                *key++ = (kb[k]                                + safer_ebox[(int)safer_ebox[(int)((18 * i + j + 10)&0xFF)]]) & 0xFF;                if (++k == (SAFER_BLOCK_LEN + 1)) { k = 0; }            } else {                *key++ = (kb[j] + safer_ebox[(int)safer_ebox[(int)((18 * i + j + 10)&0xFF)]]) & 0xFF;            }        }    }    #ifdef LTC_CLEAN_STACK    zeromem(ka, sizeof(ka));    zeromem(kb, sizeof(kb));#endif}#ifdef LTC_CLEAN_STACKstatic void Safer_Expand_Userkey(const unsigned char *userkey_1,                                 const unsigned char *userkey_2,                                 unsigned int nof_rounds,                                 int strengthened,                                 safer_key_t key){   _Safer_Expand_Userkey(userkey_1, userkey_2, nof_rounds, strengthened, key);   burn_stack(sizeof(unsigned char) * (2 * (SAFER_BLOCK_LEN + 1)) + sizeof(unsigned int)*2);}#endifint safer_k64_setup(const unsigned char *key, int keylen, int numrounds, symmetric_key *skey){   LTC_ARGCHK(key != NULL);   LTC_ARGCHK(skey != NULL);   if (numrounds != 0 && (numrounds < 6 || numrounds > SAFER_MAX_NOF_ROUNDS)) {      return CRYPT_INVALID_ROUNDS;   }   if (keylen != 8) {      return CRYPT_INVALID_KEYSIZE;   }   Safer_Expand_Userkey(key, key, (unsigned int)(numrounds != 0 ?numrounds:SAFER_K64_DEFAULT_NOF_ROUNDS), 0, skey->safer.key);   return CRYPT_OK;}   int safer_sk64_setup(const unsigned char *key, int keylen, int numrounds, symmetric_key *skey){   LTC_ARGCHK(key != NULL);   LTC_ARGCHK(skey != NULL);   if (numrounds != 0 && (numrounds < 6 || numrounds > SAFER_MAX_NOF_ROUNDS)) {      return CRYPT_INVALID_ROUNDS;   }   if (keylen != 8) {      return CRYPT_INVALID_KEYSIZE;   }   Safer_Expand_Userkey(key, key, (unsigned int)(numrounds != 0 ?numrounds:SAFER_SK64_DEFAULT_NOF_ROUNDS), 1, skey->safer.key);   return CRYPT_OK;}int safer_k128_setup(const unsigned char *key, int keylen, int numrounds, symmetric_key *skey){   LTC_ARGCHK(key != NULL);   LTC_ARGCHK(skey != NULL);   if (numrounds != 0 && (numrounds < 6 || numrounds > SAFER_MAX_NOF_ROUNDS)) {      return CRYPT_INVALID_ROUNDS;   }   if (keylen != 16) {      return CRYPT_INVALID_KEYSIZE;   }   Safer_Expand_Userkey(key, key+8, (unsigned int)(numrounds != 0 ?numrounds:SAFER_K128_DEFAULT_NOF_ROUNDS), 0, skey->safer.key);   return CRYPT_OK;}int safer_sk128_setup(const unsigned char *key, int keylen, int numrounds, symmetric_key *skey){   LTC_ARGCHK(key != NULL);   LTC_ARGCHK(skey != NULL);   if (numrounds != 0 && (numrounds < 6 || numrounds > SAFER_MAX_NOF_ROUNDS)) {      return CRYPT_INVALID_ROUNDS;   }   if (keylen != 16) {      return CRYPT_INVALID_KEYSIZE;   }   Safer_Expand_Userkey(key, key+8, (unsigned int)(numrounds != 0?numrounds:SAFER_SK128_DEFAULT_NOF_ROUNDS), 1, skey->safer.key);

⌨️ 快捷键说明

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