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

📄 block_template.c

📁 python的加密库
💻 C
📖 第 1 页 / 共 2 页
字号:
		break;	default:		PyErr_Format(PyExc_SystemError, 			     "Unknown ciphertext feedback mode %i; "			     "this shouldn't happen",			     self->mode);		free(buffer);		return NULL;	}	result=PyString_FromStringAndSize(buffer, len);	free(buffer);	return(result);}static char ALG_Decrypt__doc__[] ="decrypt(string): Decrypt the provided string of binary data.";static PyObject *ALG_Decrypt(ALGobject *self, PyObject *args){	unsigned char *buffer, *str;	unsigned char temp[BLOCK_SIZE];	int i, j, len;	PyObject *result;  	if (!PyArg_Parse(args, "s#", &str, &len))		return NULL;	if (len==0)			/* Handle empty string */	{		return PyString_FromStringAndSize(NULL, 0);	}	if ( (len % BLOCK_SIZE) !=0 && 	     (self->mode!=MODE_CFB && self->mode!=MODE_PGP))	{		PyErr_Format(PyExc_ValueError, 			     "Input strings must be "			     "a multiple of %i in length",			     BLOCK_SIZE);		return NULL;	}	if (self->mode == MODE_CFB && 	    (len % (self->segment_size/8) !=0)) {		PyErr_Format(PyExc_ValueError, 			     "Input strings must be a multiple of "			     "the segment size %i in length",			     self->segment_size/8);		return NULL;	}	buffer=malloc(len);	if (buffer==NULL) 	{		PyErr_SetString(PyExc_MemoryError, 				"No memory available in " _MODULE_STRING				" decrypt");		return NULL;	}	switch(self->mode)	{	case(MODE_ECB):      		for(i=0; i<len; i+=BLOCK_SIZE) 		{			block_decrypt(&(self->st), str+i, buffer+i);		}		break;	case(MODE_CBC):      		for(i=0; i<len; i+=BLOCK_SIZE) 		{			memcpy(self->oldCipher, self->IV, BLOCK_SIZE);			block_decrypt(&(self->st), str+i, temp);			for(j=0; j<BLOCK_SIZE; j++) 			{				buffer[i+j]=temp[j]^self->IV[j];				self->IV[j]=str[i+j];			}		}		break;	case(MODE_CFB):      		for(i=0; i<len; i+=self->segment_size/8) 		{			block_encrypt(&(self->st), self->IV, temp);			for (j=0; j<self->segment_size/8; j++) {				buffer[i+j] = str[i+j]^temp[j];			}			if (self->segment_size == BLOCK_SIZE * 8) {				/* s == b: segment size is identical to 				   the algorithm block size */				memcpy(self->IV, str + i, BLOCK_SIZE);			}			else if ((self->segment_size % 8) == 0) {				int sz = self->segment_size/8;				memmove(self->IV, self->IV + sz, 					BLOCK_SIZE-sz);				memcpy(self->IV + BLOCK_SIZE - sz, str + i, 				       sz);			}			else {				/* segment_size is not a multiple of 8; 				   currently this can't happen */			}		}		break;	case(MODE_PGP):		if (len<=BLOCK_SIZE-self->count) 		{			                        /* If less than one block, XOR it in */			unsigned char t;			for(i=0; i<len; i++)			{				t=self->IV[self->count+i];				buffer[i] = t ^ (self->IV[self->count+i] = str[i]);			}			self->count += len;		}		else 		{			int j;			unsigned char t;			for(i=0; i<BLOCK_SIZE-self->count; i++) 			{				t=self->IV[self->count+i];				buffer[i] = t ^ (self->IV[self->count+i] = str[i]);			}			self->count=0;			for(; i<len-BLOCK_SIZE; i+=BLOCK_SIZE) 			{				block_encrypt(&(self->st), self->oldCipher, self->IV);				for(j=0; j<BLOCK_SIZE; j++)				{					t=self->IV[j];					buffer[i+j] = t ^ (self->IV[j] = str[i+j]);				}			}			/* Do the remaining 1 to BLOCK_SIZE bytes */			block_encrypt(&(self->st), self->oldCipher, self->IV);			self->count=len-i;			for(j=0; j<len-i; j++) 			{				t=self->IV[j];				buffer[i+j] = t ^ (self->IV[j] = str[i+j]);			}		}		break;	case (MODE_OFB):		for(i=0; i<len; i+=BLOCK_SIZE) 		{			block_encrypt(&(self->st), self->IV, temp);			memcpy(self->IV, temp, BLOCK_SIZE);			for(j=0; j<BLOCK_SIZE; j++)			{				buffer[i+j] = str[i+j] ^ self->IV[j];			}		}      		break;	case (MODE_CTR):		for(i=0; i<len; i+=BLOCK_SIZE) 		{			PyObject *ctr = PyObject_CallObject(self->counter, NULL);			if (ctr == NULL) {				free(buffer);				return NULL;			}			if (!PyString_Check(ctr))			{				PyErr_SetString(PyExc_TypeError, 						"CTR counter function didn't return a string");				Py_DECREF(ctr);				free(buffer);				return NULL;			}			if (PyString_Size(ctr) != BLOCK_SIZE) {				PyErr_SetString(PyExc_TypeError, 						"CTR counter function returned string of incorrect length");				Py_DECREF(ctr);				free(buffer);				return NULL;			}			block_encrypt(&(self->st), PyString_AsString(ctr), temp);			Py_DECREF(ctr);			for(j=0; j<BLOCK_SIZE; j++)			{				buffer[i+j] = str[i+j]^temp[j];			}		}		break;	default:		PyErr_Format(PyExc_SystemError, 			     "Unknown ciphertext feedback mode %i; "			     "this shouldn't happen",			     self->mode);		free(buffer);		return NULL;	}	result=PyString_FromStringAndSize(buffer, len);	free(buffer);	return(result);}static char ALG_Sync__doc__[] ="sync(): For objects using the PGP feedback mode, this method modifies ""the IV, synchronizing it with the preceding ciphertext.";static PyObject *ALG_Sync(ALGobject *self, PyObject *args){	if (!PyArg_ParseTuple(args, "")) {		return NULL;	}	if (self->mode!=MODE_PGP) 	{		PyErr_SetString(PyExc_SystemError, "sync() operation not defined for "				"this feedback mode");		return NULL;	}		if (self->count!=8) 	{		memmove(self->IV+BLOCK_SIZE-self->count, self->IV, 			self->count);		memcpy(self->IV, self->oldCipher+self->count, 		       BLOCK_SIZE-self->count);		self->count=8;	}	Py_INCREF(Py_None);	return Py_None;}#if 0void PrintState(self, msg)     ALGobject *self;     char * msg;{  int count;    printf("%sing: %i IV ", msg, (int)self->count);  for(count=0; count<8; count++) printf("%i ", self->IV[count]);  printf("\noldCipher:");  for(count=0; count<8; count++) printf("%i ", self->oldCipher[count]);  printf("\n");}#endif/* ALG object methods */static PyMethodDef ALGmethods[] ={ {"encrypt", (PyCFunction) ALG_Encrypt, 0, ALG_Encrypt__doc__}, {"decrypt", (PyCFunction) ALG_Decrypt, 0, ALG_Decrypt__doc__}, {"sync", (PyCFunction) ALG_Sync, METH_VARARGS, ALG_Sync__doc__}, {NULL, NULL}			/* sentinel */};static intALGsetattr(PyObject *ptr, char *name, PyObject *v){  ALGobject *self=(ALGobject *)ptr;  if (strcmp(name, "IV") != 0)     {      PyErr_Format(PyExc_AttributeError,		   "non-existent block cipher object attribute '%s'",		   name);      return -1;    }  if (v==NULL)    {      PyErr_SetString(PyExc_AttributeError,		      "Can't delete IV attribute of block cipher object");      return -1;    }  if (!PyString_Check(v))    {      PyErr_SetString(PyExc_TypeError,		      "IV attribute of block cipher object must be string");      return -1;    }  if (PyString_Size(v)!=BLOCK_SIZE)     {      PyErr_Format(PyExc_ValueError, 		   _MODULE_STRING " IV must be %i bytes long",		   BLOCK_SIZE);      return -1;    }  memcpy(self->IV, PyString_AsString(v), BLOCK_SIZE);  return 0;}static PyObject *ALGgetattr(PyObject *s, char *name){  ALGobject *self = (ALGobject*)s;  if (strcmp(name, "IV") == 0)     {      return(PyString_FromStringAndSize(self->IV, BLOCK_SIZE));    }  if (strcmp(name, "mode") == 0)     {       return(PyInt_FromLong((long)(self->mode)));     }  if (strcmp(name, "block_size") == 0)     {       return PyInt_FromLong(BLOCK_SIZE);     }  if (strcmp(name, "key_size") == 0)     {       return PyInt_FromLong(KEY_SIZE);     } return Py_FindMethod(ALGmethods, (PyObject *) self, name);}/* List of functions defined in the module */static struct PyMethodDef modulemethods[] ={ {"new", (PyCFunction) ALGnew, METH_VARARGS|METH_KEYWORDS, ALGnew__doc__}, {NULL, NULL}			/* sentinel */};static PyTypeObject ALGtype ={	PyObject_HEAD_INIT(NULL)	0,				/*ob_size*/	_MODULE_STRING,		/*tp_name*/	sizeof(ALGobject),	/*tp_size*/	0,				/*tp_itemsize*/	/* methods */	ALGdealloc,	/*tp_dealloc*/	0,				/*tp_print*/	ALGgetattr,	/*tp_getattr*/	ALGsetattr,    /*tp_setattr*/	0,			/*tp_compare*/	(reprfunc) 0,			/*tp_repr*/	0,				/*tp_as_number*/};/* Initialization function for the module */#if PYTHON_API_VERSION < 1011#define PyModule_AddIntConstant(m,n,v) {PyObject *o=PyInt_FromLong(v); \           if (o!=NULL) \             {PyDict_SetItemString(PyModule_GetDict(m),n,o); Py_DECREF(o);}}#endifvoid_MODULE_NAME (void){	PyObject *m;	ALGtype.ob_type = &PyType_Type;	/* Create the module and add the functions */	m = Py_InitModule("Crypto.Cipher." _MODULE_STRING, modulemethods);	PyModule_AddIntConstant(m, "MODE_ECB", MODE_ECB);	PyModule_AddIntConstant(m, "MODE_CBC", MODE_CBC);	PyModule_AddIntConstant(m, "MODE_CFB", MODE_CFB);	PyModule_AddIntConstant(m, "MODE_PGP", MODE_PGP);	PyModule_AddIntConstant(m, "MODE_OFB", MODE_OFB);	PyModule_AddIntConstant(m, "MODE_CTR", MODE_CTR);	PyModule_AddIntConstant(m, "block_size", BLOCK_SIZE);	PyModule_AddIntConstant(m, "key_size", KEY_SIZE);	/* Check for errors */	if (PyErr_Occurred())		Py_FatalError("can't initialize module " _MODULE_STRING);}

⌨️ 快捷键说明

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