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

📄 deskey.c

📁 des算法实现源码
💻 C
字号:
/* * String to key transformation based upon: * *    FIPS Pub 112: "Password Usage" 1985 May 30. * * Written by David A. Barrett	(barrett@boulder.Colorado.EDU) */#include <stdlib.h>	/* POSIX: free */#include "des.h"#include "string.h"/* * Compute a Message Authentication code according to  *    FIPS Pub 113: "Computer Data Authentication" 1985 May 30 *  * Uses DES in CBC mode with IV = 0, input string padded on right with <pad>  * to positive multiple of DES_BLOCKSIZE bytes. *    set pad = '\0' for FIPS Pub 113. *    set pad = ' '  for FIPS Pub 112. */void desStrMAC(mac, src, len, pad, key)   register char *mac, *src;   register unsigned len;   char pad;   keyType key;{   char buf[DES_BLOCKSIZE];   memset(mac, '\0', DES_BLOCKSIZE);			/* IV */   if (len > DES_BLOCKSIZE) do {      desXor(mac, mac, src, DES_BLOCKSIZE);      des(mac, mac, key);      src += DES_BLOCKSIZE;      len -= DES_BLOCKSIZE;   } while (len > DES_BLOCKSIZE);   memcpy(buf, src, len);	/* len can be 0 or DES_BLOCKSIZE */   memset(buf + len, pad, DES_BLOCKSIZE - len);   desXor(mac, mac, buf, DES_BLOCKSIZE);   des(mac, mac, key);}/* * Shift each byte in a block of memory left by one bit * * Used because ASCII has high bit clear, and DES ignores low bit. */void setkeybits(d, s, count)   register char *d, *s;   register unsigned count;{   if (count != 0) do {      *d++ = *s++ << 1;			/* ignore hi bit, clear lo bit */   }  while (--count != 0);}/* * Convert an ASCII string of arbitrary length to an 8-byte key suitable as an  * input key for the DES. * * The string is padded on the right with <pad> to a multiple of 8 characters. * The minimim length of the resulting string will be 16 characters. * A key is computed by using the first 8 characters of the string, each * character left-shifted by one bit.  This key is used to encipher the * remaining characters of the string using the DES in CFB mode, IV = 0, * to compute a Message Authentication Code ala FIPS PUB 113. * * For input strings of 8 or fewer characters, this will result in the * DES encryption of the string consisting of 8 <pad> characters.  FIPS * Pub 112 used the space character for <pad>. * * Note: Unlike fips Pub 112, this algorithm does not restrict the output * bits to be an 8 character string consisting of the printable ASCII * characters.  The string is returned as 8 chararcters of 8-bits each. * No parity is computed. */void desKey(keybits, str, pad)   char *keybits;   char *str;   int pad;{   register unsigned len = strlen(str);   unsigned     keysize = len;   keyType 	key = (keyType) 0;   if (keysize > DES_BLOCKSIZE) keysize = DES_BLOCKSIZE;   setkeybits(keybits, str, keysize);		/* key */   memset(keybits + keysize, pad << 1, DES_BLOCKSIZE - keysize);   str += keysize;   len -= keysize;   desMakeKey(&key, keybits, DES_BLOCKSIZE, 0);		/* encryption mode */   desStrMAC(keybits, str, len, pad, key);   free((char *) key);}

⌨️ 快捷键说明

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