deshash.cpp
上传用户:jinandeyu
上传日期:2007-01-05
资源大小:620k
文件大小:15k
源码类别:

远程控制编程

开发平台:

WINDOWS

  1. /*  Back Orifice 2000 - Remote Administration Suite
  2.     Copyright (C) 1999, Cult Of The Dead Cow
  3.     This program is free software; you can redistribute it and/or modify
  4.     it under the terms of the GNU General Public License as published by
  5.     the Free Software Foundation; either version 2 of the License, or
  6.     (at your option) any later version.
  7.     This program is distributed in the hope that it will be useful,
  8.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.     GNU General Public License for more details.
  11.     You should have received a copy of the GNU General Public License
  12.     along with this program; if not, write to the Free Software
  13.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14. The author of this program may be contacted at dildog@l0pht.com. */
  15. /* 
  16.    Note on DES Hashing:
  17.    This module has been crippled such that it is NOT usable for encryption per
  18.    United States export ITAR regulations. This module only operates on hashes
  19.    for authentication, which are not regulated by ITAR.
  20.    Used ONLY for decoding the internal Windows password hashes in dumppw.cpp
  21.    Developer note: As this is not an encryption module, it is not coded to the 
  22.    standards of the CEncryptionEngine. It only uses CEncryptionEngine format
  23.    as a convenience.
  24. */
  25.    
  26. #include<windows.h>
  27. #include<stdio.h>
  28. #include<encryption.h>
  29. #include<config.h>
  30. // ---------- Tables defined in the Data Encryption Standard documents ----------------------------
  31. // Initial permutation IP
  32. static BYTE ip[] = {
  33. 58, 50, 42, 34, 26, 18, 10,  2,
  34.     60, 52, 44, 36, 28, 20, 12,  4,
  35.     62, 54, 46, 38, 30, 22, 14,  6,
  36.     64, 56, 48, 40, 32, 24, 16,  8,
  37.     57, 49, 41, 33, 25, 17,  9,  1,
  38.     59, 51, 43, 35, 27, 19, 11,  3,
  39.     61, 53, 45, 37, 29, 21, 13,  5,
  40.     63, 55, 47, 39, 31, 23, 15,  7
  41. };
  42. // Final permutation IP^-1
  43. static BYTE fp[] = {
  44. 40,  8, 48, 16, 56, 24, 64, 32,
  45.     39,  7, 47, 15, 55, 23, 63, 31,
  46.     38,  6, 46, 14, 54, 22, 62, 30,
  47.     37,  5, 45, 13, 53, 21, 61, 29,
  48.     36,  4, 44, 12, 52, 20, 60, 28,
  49.     35,  3, 43, 11, 51, 19, 59, 27,
  50.     34,  2, 42, 10, 50, 18, 58, 26,
  51.     33,  1, 41,  9, 49, 17, 57, 25
  52. };
  53. // permuted choice table (key)
  54. static BYTE pc1[] = {
  55. 57, 49, 41, 33, 25, 17,  9,
  56.  1, 58, 50, 42, 34, 26, 18,
  57.     10,  2, 59, 51, 43, 35, 27,
  58.     19, 11,  3, 60, 52, 44, 36,
  59.     63, 55, 47, 39, 31, 23, 15,
  60.  7, 62, 54, 46, 38, 30, 22,
  61.     14,  6, 61, 53, 45, 37, 29,
  62.     21, 13,  5, 28, 20, 12,  4
  63. };
  64. // number left rotations of pc1
  65. static BYTE totrot[] = {
  66. 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28
  67. };
  68. // permuted choice key (table)
  69. static BYTE pc2[] = {
  70. 14, 17, 11, 24,  1,  5,
  71.  3, 28, 15,  6, 21, 10,
  72.     23, 19, 12,  4, 26,  8,
  73.     16,  7, 27, 20, 13,  2,
  74.     41, 52, 31, 37, 47, 55,
  75.     30, 40, 51, 45, 33, 48,
  76.     44, 49, 39, 56, 34, 53,
  77.     46, 42, 50, 36, 29, 32
  78. };
  79. // The s boxes
  80. static BYTE si[8][64] = {
  81. // S1
  82. {  14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
  83. 0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
  84. 4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
  85.        15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13 },
  86.     // S2
  87. {  15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
  88. 3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
  89. 0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
  90.    13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9 },
  91. // S3
  92. {  10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
  93.    13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
  94.    13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
  95.     1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12 },
  96. // S4
  97. {   7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
  98.    13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
  99.    10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
  100.     3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14 },
  101. // S5 
  102. {   2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
  103.        14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
  104.     4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
  105.    11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3 },
  106. // S6 
  107. {  12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
  108.    10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
  109.     9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
  110.     4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13 },
  111. // S7
  112. {   4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
  113.    13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
  114.     1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
  115.     6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12 },
  116. // S8
  117. {  13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
  118.     1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
  119.     7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
  120.     2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11 }
  121. };
  122. // 32-bit permutation function P used on the output of the S-boxes
  123. static BYTE p32i[] = {
  124. 16,  7, 20, 21,
  125.     29, 12, 28, 17,
  126.      1, 15, 23, 26,
  127.  5, 18, 31, 10,
  128.  2,  8, 24, 14,
  129.     32, 27,  3,  9,
  130.     19, 13, 30,  6,
  131.     22, 11,  4, 25
  132. };
  133. // ---- Global Variables ------------------------------------------------
  134. ENCRYPTION_ENGINE g_DESengine={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
  135. DWORD sp[8][64];              // Combined S and P boxes
  136. BYTE iperm[16][16][8];       // Initial permutations
  137. BYTE fperm[16][16][8];       // Final permutations
  138. int bytebit[] = { 0200,0100,040,020,010,04,02,01 };
  139. int nibblebit[] = { 010,04,02,01 };
  140. // ---- Structures ------------------------------------------------------
  141. typedef struct {
  142. BYTE kn[16][8];     // 8 6-bit subkeys for each of 16 initialized by des_setkey()
  143. } DESHASH_DATA;
  144. // ---- Function Prototypes ---------------------------------------------
  145. int __cdecl DESHash_Insert(void);
  146. int __cdecl DESHash_Remove(void);
  147. char * __cdecl DESHash_Query(void);
  148. void * __cdecl DESHash_Startup(void);
  149. int __cdecl DESHash_Shutdown(void *pInternal);
  150. int __cdecl DESHash_SetEncryptKey(void *pInternal, char *svKey);
  151. int __cdecl DESHash_SetDecryptKey(void *pInternal, char *svKey);
  152. char * __cdecl DESHash_GetEncryptKey(void *pInternal);
  153. char * __cdecl DESHash_GetDecryptKey(void *pInternal);
  154. BYTE * __cdecl DESHash_Encrypt(void *pInternal, BYTE *pBuffer,int nBufLen,int *pnOutBufLen);
  155. BYTE * __cdecl DESHash_Decrypt(void *pInternal, BYTE *pBuffer,int nBufLen,int *pnOutBufLen);
  156. int __cdecl DESHash_CreateNewKeys(void *pInternal);
  157. void __cdecl DESHash_Free(void *pInternal, BYTE *pBuffer);
  158.  
  159. // ---- Function Declarations -------------------------------------------
  160. #ifndef  BIG_ENDIAN
  161. // Byte swap a long 
  162. DWORD byteswap(DWORD x)
  163. {
  164. char *cp,tmp;
  165. cp = (char *)&x;
  166. tmp = cp[3];
  167. cp[3] = cp[0];
  168. cp[0] = tmp;
  169. tmp = cp[2];
  170. cp[2] = cp[1];
  171. cp[1] = tmp;
  172. return x;
  173. }
  174. #endif
  175. // ---- initialize a perm array ----
  176. static void perminit(BYTE perm[16][16][8], BYTE p[64])
  177. {
  178. int i,j,k,l,m;
  179. // Clear the permutation array
  180. for (i=0; i<16; i++) {
  181. for (j=0; j<16; j++) {
  182. // Clear permutation
  183. for (k=0; k<8; k++) {
  184. perm[i][j][k]=0;
  185. }
  186. // each input nibble position
  187. for (i=0; i<16; i++) {
  188. // each possible input nibble
  189. for (j = 0; j < 16; j++) {
  190. // each output bit position
  191. for (k = 0; k < 64; k++) {
  192. // where does this bit come from
  193. l = p[k] - 1; 
  194. // does it come from input posn
  195. if ((l >> 2) != i) continue;     // if not, bit k is 0
  196. // any such bit in input?
  197. if (!(j & nibblebit[l & 3])) continue;     
  198. // which bit is this in the byte?
  199. m = k & 07;   
  200. perm[i][j][k>>3] |= (char)bytebit[m];
  201. }
  202. }
  203. }
  204. }
  205. }
  206. }
  207. // ---- Initialize the lookup table for the combined S and P boxes ----
  208. static void spinit()
  209. {
  210. BYTE pbox[32];
  211. int p,i,s,j,rowcol;
  212. DWORD val;
  213. // Compute pbox, the inverse of p32i.
  214. // This is easier to work with
  215. for(p=0;p<32;p++){
  216. for(i=0;i<32;i++){
  217. if(p32i[i]-1 == p){
  218. pbox[p] = (char)i;
  219. break;
  220. }
  221. }
  222. }
  223. // For each S-box
  224. for(s = 0; s < 8; s++) {  
  225. // For each possible input
  226. for(i=0; i<64; i++) {
  227. val = 0;
  228. // The row number is formed from the first and last
  229. // bits; the column number is from the middle 4
  230. rowcol = (i & 32) | ((i & 1) ? 16 : 0) | ((i >> 1) & 0xf);
  231. for(j=0;j<4;j++) {       // For each output bit
  232. if(si[s][rowcol] & (8 >> j)){
  233. val |= 1L << (31 - pbox[4*s + j]);
  234. }
  235. }
  236. sp[s][i] = val;
  237. }
  238. }
  239. }
  240. // permute: takes an input block, passes it through a permutation
  241. //          (if desmode == 0) and returns an output block
  242. void des_permute(BYTE *inblock, BYTE perm[16][16][8], BYTE *outblock)
  243. {
  244. int i,j;
  245. BYTE *ib,*ob,*p,*q;
  246. // Clear Output block
  247. memset(outblock, 0, 8*sizeof(BYTE));
  248. // Perform permutation
  249. ib = inblock;
  250. for (j = 0; j < 16; j += 2, ib++) { // for each input nibble
  251. ob = outblock;
  252. p = perm[j][(*ib >> 4) & 017];
  253. q = perm[j + 1][*ib & 017];
  254. for (i = 8; i != 0; i--){   // and each output byte 
  255. *ob++ |= *p++ | *q++;   // OR the masks together
  256. }
  257. }
  258. }
  259. // The nonlinear function f(r,k), the heart of DES
  260. static DWORD f(DWORD r, BYTE subkey[8])
  261. {
  262. DWORD rval,rt;
  263. // Run E(R) ^ K through the combined S & P boxes
  264. // This code takes advantage of a convenient regularity in
  265. // E, namely that each group of 6 bits in E(R) feeding
  266. // a single S-box is a contiguous segment of R.
  267. rt = (r >> 1) | ((r & 1) ? 0x80000000 : 0);
  268. rval = 0;
  269. rval |= sp[0][((rt >> 26) ^ *subkey++) & 0x3f];
  270. rval |= sp[1][((rt >> 22) ^ *subkey++) & 0x3f];
  271. rval |= sp[2][((rt >> 18) ^ *subkey++) & 0x3f];
  272. rval |= sp[3][((rt >> 14) ^ *subkey++) & 0x3f];
  273. rval |= sp[4][((rt >> 10) ^ *subkey++) & 0x3f];
  274. rval |= sp[5][((rt >> 6) ^ *subkey++) & 0x3f];
  275. rval |= sp[6][((rt >> 2) ^ *subkey++) & 0x3f];
  276. rt = (r << 1) | ((r & 0x80000000) ? 1 : 0);
  277. rval |= sp[7][(rt ^ *subkey) & 0x3f];
  278. return rval;
  279. }
  280. // round: Do one DES cipher round 
  281. void des_round(int num, DWORD *block, BYTE kn[16][8])
  282. {
  283. // The rounds are numbered from 0 to 15. On even rounds
  284. // the right half is fed to f() and the result exclusive-ORs
  285. // the left half; on odd rounds the reverse is done.
  286. if(num & 1)
  287. block[1] ^= f(block[0],kn[num]);
  288. else 
  289. block[0] ^= f(block[1],kn[num]);
  290. }
  291. // In-place decryption of 64-bit block 
  292. void des_dedes(BYTE *block, BYTE kn[16][8])
  293. {
  294. int i;
  295. DWORD work[2], tmp;
  296. // Initial permutation
  297. des_permute(block,iperm,(BYTE *)work);    
  298. #ifndef BIG_ENDIAN
  299. work[0] = byteswap(work[0]);
  300. work[1] = byteswap(work[1]);
  301. #endif
  302. // Left/right half swap
  303. tmp = work[0];
  304. work[0] = work[1];
  305. work[1] = tmp;
  306. // Do the 16 rounds in reverse order
  307. for (i=15; i >= 0; i--)
  308. des_round(i,work, kn);
  309. // Inverse initial permutation
  310. #ifndef BIG_ENDIAN
  311. work[0] = byteswap(work[0]);
  312. work[1] = byteswap(work[1]);
  313. #endif
  314. des_permute((BYTE *)work,fperm,block);    
  315. }
  316. // setkey:
  317. // initializes key schedule array
  318. // key is 64 bits (will use only 56)
  319. void des_setkey(BYTE *key, BYTE kn[16][8])
  320. {
  321. BYTE pc1m[56];              // place to modify pc1 into 
  322. BYTE pcr[56];               // place to rotate pc1 into 
  323. register int i,j,l,m;
  324. // Clear key schedule
  325. for (i=0; i<16; i++) {
  326. for (j=0; j<8; j++) {
  327. kn[i][j]=0;
  328. }
  329. }
  330.  
  331. // Convert pc1 to bits of key 
  332. for(j=0; j<56; j++) {  
  333. l=pc1[j]-1;                     // integer bit location  
  334. m = l & 07;                     // find bit              
  335. pc1m[j]= (char)((key[l>>3] &    // find which key byte l is in 
  336. bytebit[m])                 // and which bit of that byte 
  337. ? 1 : 0);                   // and store 1-bit result
  338. }
  339. // Key chunk for each iteration
  340.     for (i=0; i<16; i++) { 
  341. // Rotate pc1 the right amount
  342. for (j=0; j<56; j++)    
  343. pcr[j] = pc1m[(l=j+totrot[i])<(j<28? 28 : 56) ? l: l-28];
  344. // Rotate left and right halves independently
  345. for (j=0; j<48; j++) {   // select bits individually
  346. // check bit that goes to kn[j]
  347. if (pcr[pc2[j]-1]) {
  348. // mask it in if it's there
  349. l= j % 6;
  350. kn[i][j/6] |= (BYTE)(bytebit[l] >> 2);
  351. }
  352. }
  353. }
  354. }
  355. void des_str_to_key(BYTE *str, BYTE *key)
  356. {
  357. int i;
  358. key[0] = (str[0]>>1);
  359. key[1] = ((str[0]&0x01)<<6) | (str[1]>>2);
  360. key[2] = ((str[1]&0x03)<<5) | (str[2]>>3);
  361. key[3] = ((str[2]&0x07)<<4) | (str[3]>>4);
  362. key[4] = ((str[3]&0x0F)<<3) | (str[4]>>5);
  363. key[5] = ((str[4]&0x1F)<<2) | (str[5]>>6);
  364. key[6] = ((str[5]&0x3F)<<1) | (str[6]>>7);
  365. key[7] = (str[6]&0x7F);
  366. for (i=0;i<8;i++)
  367. key[i] = (BYTE)(key[i]<<1);
  368. }
  369. int __cdecl DESHash_Insert(void)
  370. {
  371. spinit();
  372. perminit(iperm, ip);
  373. perminit(fperm, fp);
  374. return 0;
  375. }
  376. int __cdecl DESHash_Remove(void)
  377. {
  378. return 0;
  379. }
  380. char * __cdecl DESHash_Query(void)
  381. {
  382. return "DES: BO2K DES Hash Manipulation";
  383. }
  384. void * __cdecl DESHash_Startup(void)
  385. {
  386. DESHASH_DATA *data;
  387. data=(DESHASH_DATA *)malloc(sizeof(DESHASH_DATA));
  388. if(data==NULL) return NULL;
  389. return data;
  390. }
  391. int __cdecl DESHash_Shutdown(void *pInternal)
  392. {
  393. DESHASH_DATA *data=(DESHASH_DATA *)pInternal;
  394. free(data);
  395. return 0;
  396. }
  397. int __cdecl DESHash_SetEncryptKey(void *pInternal, char *svKey)
  398. {
  399. return 0;
  400. }
  401. int __cdecl DESHash_SetDecryptKey(void *pInternal, char *svKey)
  402. {
  403. DESHASH_DATA *data=(DESHASH_DATA *)pInternal;
  404. BYTE key[8];
  405. des_str_to_key((BYTE *)svKey,key);
  406. des_setkey(key,data->kn);
  407. return 0;
  408. }
  409. char * __cdecl DESHash_GetEncryptKey(void *pInternal)
  410. {
  411. return NULL;
  412. }
  413. char * __cdecl DESHash_GetDecryptKey(void *pInternal)
  414. {
  415. return NULL;
  416. }
  417. BYTE * __cdecl DESHash_Encrypt(void *pInternal, BYTE *pBuffer,int nBufLen,int *pnOutBufLen)
  418. {
  419. *pnOutBufLen=0;
  420. return NULL;
  421. }
  422. BYTE * __cdecl DESHash_Decrypt(void *pInternal, BYTE *pBuffer,int nBufLen,int *pnOutBufLen)
  423. {
  424. DESHASH_DATA *data=(DESHASH_DATA *)pInternal;
  425. BYTE *buf;
  426. int nOutBufLen,i;
  427. if(nBufLen&7) nOutBufLen=(nBufLen&~7)+8;
  428. else nOutBufLen=nBufLen;
  429. buf=(BYTE *)malloc(nOutBufLen);
  430. if(buf==NULL) return NULL;
  431. memset(buf,0,nOutBufLen);
  432. memcpy(buf,pBuffer,nBufLen);
  433. for(i=0;i<nOutBufLen;i+=8) {
  434. des_dedes((BYTE *)buf+i,data->kn);
  435. }
  436. *pnOutBufLen=nOutBufLen;
  437. return buf;
  438. }
  439. int __cdecl DESHash_CreateNewKeys(void *pInternal)
  440. {
  441. return 0;
  442. }
  443. void __cdecl DESHash_Free(void *pInternal, BYTE *pBuffer)
  444. {
  445. DESHASH_DATA *data=(DESHASH_DATA *)pInternal;
  446. free(pBuffer);
  447. }
  448. ENCRYPTION_ENGINE *GetDESHashEngine(void)
  449. {
  450. g_DESengine.pInsert=DESHash_Insert;
  451. g_DESengine.pRemove=DESHash_Remove;
  452. g_DESengine.pQuery=DESHash_Query;
  453. g_DESengine.pStartup=DESHash_Startup;
  454. g_DESengine.pShutdown=DESHash_Shutdown;
  455. g_DESengine.pSetEncryptKey=DESHash_SetEncryptKey;
  456. g_DESengine.pSetDecryptKey=DESHash_SetDecryptKey;
  457. g_DESengine.pGetEncryptKey=DESHash_GetEncryptKey;
  458. g_DESengine.pGetDecryptKey=DESHash_GetDecryptKey;
  459. g_DESengine.pEncrypt=DESHash_Encrypt;
  460. g_DESengine.pDecrypt=DESHash_Decrypt;
  461. g_DESengine.pCreateNewKeys=DESHash_CreateNewKeys;
  462. g_DESengine.pFree=DESHash_Free;
  463. return &g_DESengine;
  464. }