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

📄 des.c

📁 python的加密库
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  des.c : Source code for the DES block cipher * * Part of the Python Cryptography Toolkit * * Distribute and use freely; there are no restrictions on further  * dissemination and usage except those imposed by the laws of your  * country of residence. * */#include "Python.h"  /* des.c *//* Copyright (C) 1993 Eric Young *//* Integrated into the PCT by A.M. Kuchling, November 1994 */#define MODULE_NAME DES#define BLOCK_SIZE 8#define KEY_SIZE 8typedef unsigned char des_cblock[8];/* ecb_enc.c *//* Copyright (C) 1993 Eric Young - see README for more details */#define c2l(c,l)	(l =((unsigned long)(*((c)++)))    , \			 l|=((unsigned long)(*((c)++)))<< 8, \			 l|=((unsigned long)(*((c)++)))<<16, \			 l|=((unsigned long)(*((c)++)))<<24)/* NOTE - c is not incremented as per c2l */#define c2ln(c,l1,l2,n)	{ \			c+=n; \			l1=l2=0; \			switch (n) { \			case 8: l2|=((unsigned long)(*(--(c))))<<24; \			case 7: l2|=((unsigned long)(*(--(c))))<<16; \			case 6: l2|=((unsigned long)(*(--(c))))<< 8; \			case 5: l2|=((unsigned long)(*(--(c))));     \			case 4: l1|=((unsigned long)(*(--(c))))<<24; \			case 3: l1|=((unsigned long)(*(--(c))))<<16; \			case 2: l1|=((unsigned long)(*(--(c))))<< 8; \			case 1: l1|=((unsigned long)(*(--(c))));     \				} \			}#define l2c(l,c)	(*((c)++)=(unsigned char)(((l)    )&0xff), \			 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \			 *((c)++)=(unsigned char)(((l)>>16)&0xff), \			 *((c)++)=(unsigned char)(((l)>>24)&0xff))/* replacements for htonl and ntohl since I have no idea what to do * when faced with machines with 8 byte longs. */#define HDRSIZE 4#define n2l(c,l)	(l =((unsigned long)(*((c)++)))<<24, \			 l|=((unsigned long)(*((c)++)))<<16, \			 l|=((unsigned long)(*((c)++)))<< 8, \			 l|=((unsigned long)(*((c)++))))#define l2n(l,c)	(*((c)++)=(unsigned char)(((l)>>24)&0xff), \			 *((c)++)=(unsigned char)(((l)>>16)&0xff), \			 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \			 *((c)++)=(unsigned char)(((l)    )&0xff))/* NOTE - c is not incremented as per l2c */#define l2cn(l1,l2,c,n)	{ \			c+=n; \			switch (n) { \			case 8: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \			case 7: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \			case 6: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \			case 5: *(--(c))=(unsigned char)(((l2)    )&0xff); \			case 4: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \			case 3: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \			case 2: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \			case 1: *(--(c))=(unsigned char)(((l1)    )&0xff); \				} \			}#define D_ENCRYPT(L,R,S)	\	u=(R^s[S  ]); \	t=R^s[S+1]; \	t=((t>>4)+(t<<28)); \	L^=	des_SPtrans[1][(t    )&0x3f]| \		des_SPtrans[3][(t>> 8)&0x3f]| \		des_SPtrans[5][(t>>16)&0x3f]| \		des_SPtrans[7][(t>>24)&0x3f]| \		des_SPtrans[0][(u    )&0x3f]| \		des_SPtrans[2][(u>> 8)&0x3f]| \		des_SPtrans[4][(u>>16)&0x3f]| \		des_SPtrans[6][(u>>24)&0x3f];	/* IP and FP	 * The problem is more of a geometric problem that random bit fiddling.	 0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6	 8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4	16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2	24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0	32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7	40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5	48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3	56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1	The output has been subject to swaps of the form	0 1 -> 3 1 but the odd and even bits have been put into	2 3    2 0	different words.  The main trick is to remember that	t=((l>>size)^r)&(mask);	r^=t;	l^=(t<<size);	can be used to swap and move bits between words.	So l =  0  1  2  3  r = 16 17 18 19	        4  5  6  7      20 21 22 23	        8  9 10 11      24 25 26 27	       12 13 14 15      28 29 30 31	becomes (for size == 2 and mask == 0x3333)	   t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19		 6^20  7^21 -- --        4  5 20 21       6  7 22 23		10^24 11^25 -- --        8  9 24 25      10 11 24 25		14^28 15^29 -- --       12 13 28 29      14 15 28 29	Thanks for hints from Richard Outerbridge - he told me IP&FP	could be done in 15 xor, 10 shifts and 5 ands.	When I finally started to think of the problem in 2D	I first got ~42 operations without xors.  When I remembered	how to use xors :-) I got it to its final state.	*/#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\	(b)^=(t),\	(a)^=((t)<<(n)))/* spr.h *//* Copyright (C) 1993 Eric Young - see README for more details */static unsigned long des_SPtrans[8][64]={/* nibble 0 */	{0x00820200, 0x00020000, 0x80800000, 0x80820200,	 0x00800000, 0x80020200, 0x80020000, 0x80800000,	 0x80020200, 0x00820200, 0x00820000, 0x80000200,	 0x80800200, 0x00800000, 0x00000000, 0x80020000,	 0x00020000, 0x80000000, 0x00800200, 0x00020200,	 0x80820200, 0x00820000, 0x80000200, 0x00800200,	 0x80000000, 0x00000200, 0x00020200, 0x80820000,	 0x00000200, 0x80800200, 0x80820000, 0x00000000,	 0x00000000, 0x80820200, 0x00800200, 0x80020000,	 0x00820200, 0x00020000, 0x80000200, 0x00800200,	 0x80820000, 0x00000200, 0x00020200, 0x80800000,	 0x80020200, 0x80000000, 0x80800000, 0x00820000,	 0x80820200, 0x00020200, 0x00820000, 0x80800200,	 0x00800000, 0x80000200, 0x80020000, 0x00000000,	 0x00020000, 0x00800000, 0x80800200, 0x00820200,	 0x80000000, 0x80820000, 0x00000200, 0x80020200},/* nibble 1 */	{0x10042004, 0x00000000, 0x00042000, 0x10040000,	 0x10000004, 0x00002004, 0x10002000, 0x00042000,	 0x00002000, 0x10040004, 0x00000004, 0x10002000,	 0x00040004, 0x10042000, 0x10040000, 0x00000004,	 0x00040000, 0x10002004, 0x10040004, 0x00002000,	 0x00042004, 0x10000000, 0x00000000, 0x00040004,	 0x10002004, 0x00042004, 0x10042000, 0x10000004,	 0x10000000, 0x00040000, 0x00002004, 0x10042004,	 0x00040004, 0x10042000, 0x10002000, 0x00042004,	 0x10042004, 0x00040004, 0x10000004, 0x00000000,	 0x10000000, 0x00002004, 0x00040000, 0x10040004,	 0x00002000, 0x10000000, 0x00042004, 0x10002004,	 0x10042000, 0x00002000, 0x00000000, 0x10000004,	 0x00000004, 0x10042004, 0x00042000, 0x10040000,	 0x10040004, 0x00040000, 0x00002004, 0x10002000,	 0x10002004, 0x00000004, 0x10040000, 0x00042000},/* nibble 2 */	{0x41000000, 0x01010040, 0x00000040, 0x41000040,	 0x40010000, 0x01000000, 0x41000040, 0x00010040,	 0x01000040, 0x00010000, 0x01010000, 0x40000000,	 0x41010040, 0x40000040, 0x40000000, 0x41010000,	 0x00000000, 0x40010000, 0x01010040, 0x00000040,	 0x40000040, 0x41010040, 0x00010000, 0x41000000,	 0x41010000, 0x01000040, 0x40010040, 0x01010000,	 0x00010040, 0x00000000, 0x01000000, 0x40010040,	 0x01010040, 0x00000040, 0x40000000, 0x00010000,	 0x40000040, 0x40010000, 0x01010000, 0x41000040,	 0x00000000, 0x01010040, 0x00010040, 0x41010000,	 0x40010000, 0x01000000, 0x41010040, 0x40000000,	 0x40010040, 0x41000000, 0x01000000, 0x41010040,	 0x00010000, 0x01000040, 0x41000040, 0x00010040,	 0x01000040, 0x00000000, 0x41010000, 0x40000040,	 0x41000000, 0x40010040, 0x00000040, 0x01010000},/* nibble 3 */	{0x00100402, 0x04000400, 0x00000002, 0x04100402,	 0x00000000, 0x04100000, 0x04000402, 0x00100002,	 0x04100400, 0x04000002, 0x04000000, 0x00000402,	 0x04000002, 0x00100402, 0x00100000, 0x04000000,	 0x04100002, 0x00100400, 0x00000400, 0x00000002,	 0x00100400, 0x04000402, 0x04100000, 0x00000400,	 0x00000402, 0x00000000, 0x00100002, 0x04100400,	 0x04000400, 0x04100002, 0x04100402, 0x00100000,	 0x04100002, 0x00000402, 0x00100000, 0x04000002,	 0x00100400, 0x04000400, 0x00000002, 0x04100000,	 0x04000402, 0x00000000, 0x00000400, 0x00100002,	 0x00000000, 0x04100002, 0x04100400, 0x00000400,	 0x04000000, 0x04100402, 0x00100402, 0x00100000,	 0x04100402, 0x00000002, 0x04000400, 0x00100402,	 0x00100002, 0x00100400, 0x04100000, 0x04000402,	 0x00000402, 0x04000000, 0x04000002, 0x04100400},/* nibble 4 */	{0x02000000, 0x00004000, 0x00000100, 0x02004108,	 0x02004008, 0x02000100, 0x00004108, 0x02004000,	 0x00004000, 0x00000008, 0x02000008, 0x00004100,	 0x02000108, 0x02004008, 0x02004100, 0x00000000,	 0x00004100, 0x02000000, 0x00004008, 0x00000108,	 0x02000100, 0x00004108, 0x00000000, 0x02000008,	 0x00000008, 0x02000108, 0x02004108, 0x00004008,	 0x02004000, 0x00000100, 0x00000108, 0x02004100,	 0x02004100, 0x02000108, 0x00004008, 0x02004000,	 0x00004000, 0x00000008, 0x02000008, 0x02000100,	 0x02000000, 0x00004100, 0x02004108, 0x00000000,	 0x00004108, 0x02000000, 0x00000100, 0x00004008,	 0x02000108, 0x00000100, 0x00000000, 0x02004108,	 0x02004008, 0x02004100, 0x00000108, 0x00004000,	 0x00004100, 0x02004008, 0x02000100, 0x00000108,	 0x00000008, 0x00004108, 0x02004000, 0x02000008},/* nibble 5 */	{0x20000010, 0x00080010, 0x00000000, 0x20080800,	 0x00080010, 0x00000800, 0x20000810, 0x00080000,	 0x00000810, 0x20080810, 0x00080800, 0x20000000,	 0x20000800, 0x20000010, 0x20080000, 0x00080810,	 0x00080000, 0x20000810, 0x20080010, 0x00000000,	 0x00000800, 0x00000010, 0x20080800, 0x20080010,	 0x20080810, 0x20080000, 0x20000000, 0x00000810,	 0x00000010, 0x00080800, 0x00080810, 0x20000800,	 0x00000810, 0x20000000, 0x20000800, 0x00080810,	 0x20080800, 0x00080010, 0x00000000, 0x20000800,	 0x20000000, 0x00000800, 0x20080010, 0x00080000,	 0x00080010, 0x20080810, 0x00080800, 0x00000010,	 0x20080810, 0x00080800, 0x00080000, 0x20000810,	 0x20000010, 0x20080000, 0x00080810, 0x00000000,	 0x00000800, 0x20000010, 0x20000810, 0x20080800,	 0x20080000, 0x00000810, 0x00000010, 0x20080010},/* nibble 6 */	{0x00001000, 0x00000080, 0x00400080, 0x00400001,	 0x00401081, 0x00001001, 0x00001080, 0x00000000,	 0x00400000, 0x00400081, 0x00000081, 0x00401000,	 0x00000001, 0x00401080, 0x00401000, 0x00000081,	 0x00400081, 0x00001000, 0x00001001, 0x00401081,	 0x00000000, 0x00400080, 0x00400001, 0x00001080,	 0x00401001, 0x00001081, 0x00401080, 0x00000001,	 0x00001081, 0x00401001, 0x00000080, 0x00400000,	 0x00001081, 0x00401000, 0x00401001, 0x00000081,	 0x00001000, 0x00000080, 0x00400000, 0x00401001,	 0x00400081, 0x00001081, 0x00001080, 0x00000000,	 0x00000080, 0x00400001, 0x00000001, 0x00400080,	 0x00000000, 0x00400081, 0x00400080, 0x00001080,	 0x00000081, 0x00001000, 0x00401081, 0x00400000,	 0x00401080, 0x00000001, 0x00001001, 0x00401081,	 0x00400001, 0x00401080, 0x00401000, 0x00001001},/* nibble 7 */	{0x08200020, 0x08208000, 0x00008020, 0x00000000,	 0x08008000, 0x00200020, 0x08200000, 0x08208020,	 0x00000020, 0x08000000, 0x00208000, 0x00008020,	 0x00208020, 0x08008020, 0x08000020, 0x08200000,	 0x00008000, 0x00208020, 0x00200020, 0x08008000,	 0x08208020, 0x08000020, 0x00000000, 0x00208000,	 0x08000000, 0x00200000, 0x08008020, 0x08200020,	 0x00200000, 0x00008000, 0x08208000, 0x00000020,	 0x00200000, 0x00008000, 0x08000020, 0x08208020,	 0x00008020, 0x08000000, 0x00000000, 0x00208000,	 0x08200020, 0x08008020, 0x08008000, 0x00200020,	 0x08208000, 0x00000020, 0x00200020, 0x08008000,	 0x08208020, 0x00200000, 0x08200000, 0x08000020,	 0x00208000, 0x00008020, 0x08008020, 0x08200000,	 0x00000020, 0x08208000, 0x00208020, 0x00000000,	 0x08000000, 0x08200020, 0x00008000, 0x00208020}};static unsigned long des_skb[8][64]={/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */	{0x00000000,0x00000010,0x20000000,0x20000010,	 0x00010000,0x00010010,0x20010000,0x20010010,	 0x00000800,0x00000810,0x20000800,0x20000810,	 0x00010800,0x00010810,0x20010800,0x20010810,	 0x00000020,0x00000030,0x20000020,0x20000030,	 0x00010020,0x00010030,0x20010020,0x20010030,	 0x00000820,0x00000830,0x20000820,0x20000830,	 0x00010820,0x00010830,0x20010820,0x20010830,	 0x00080000,0x00080010,0x20080000,0x20080010,	 0x00090000,0x00090010,0x20090000,0x20090010,	 0x00080800,0x00080810,0x20080800,0x20080810,	 0x00090800,0x00090810,0x20090800,0x20090810,	 0x00080020,0x00080030,0x20080020,0x20080030,	 0x00090020,0x00090030,0x20090020,0x20090030,	 0x00080820,0x00080830,0x20080820,0x20080830,	 0x00090820,0x00090830,0x20090820,0x20090830},/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */	{0x00000000,0x02000000,0x00002000,0x02002000,	 0x00200000,0x02200000,0x00202000,0x02202000,	 0x00000004,0x02000004,0x00002004,0x02002004,	 0x00200004,0x02200004,0x00202004,0x02202004,	 0x00000400,0x02000400,0x00002400,0x02002400,	 0x00200400,0x02200400,0x00202400,0x02202400,	 0x00000404,0x02000404,0x00002404,0x02002404,	 0x00200404,0x02200404,0x00202404,0x02202404,	 0x10000000,0x12000000,0x10002000,0x12002000,	 0x10200000,0x12200000,0x10202000,0x12202000,	 0x10000004,0x12000004,0x10002004,0x12002004,	 0x10200004,0x12200004,0x10202004,0x12202004,	 0x10000400,0x12000400,0x10002400,0x12002400,	 0x10200400,0x12200400,0x10202400,0x12202400,	 0x10000404,0x12000404,0x10002404,0x12002404,	 0x10200404,0x12200404,0x10202404,0x12202404},/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */	{0x00000000,0x00000001,0x00040000,0x00040001,	 0x01000000,0x01000001,0x01040000,0x01040001,	 0x00000002,0x00000003,0x00040002,0x00040003,	 0x01000002,0x01000003,0x01040002,0x01040003,	 0x00000200,0x00000201,0x00040200,0x00040201,	 0x01000200,0x01000201,0x01040200,0x01040201,	 0x00000202,0x00000203,0x00040202,0x00040203,	 0x01000202,0x01000203,0x01040202,0x01040203,	 0x08000000,0x08000001,0x08040000,0x08040001,	 0x09000000,0x09000001,0x09040000,0x09040001,	 0x08000002,0x08000003,0x08040002,0x08040003,	 0x09000002,0x09000003,0x09040002,0x09040003,

⌨️ 快捷键说明

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