Ich bin mir momentan alles andere als sicher ob PyCrypto eine XOR-Verschlüsselung definiert (in C), aber auf jeden Fall kann man die relativ einfach selbst bauen (wie immer):
xorc.c
Code: Alles auswählen
/* XOR Crypto for Python, in C.
Copyright (C) 2006, Heiko Wundram.
Use freely, but without any warranty from the author... :-) */
#include <stdlib.h>
#include <Python.h>
typedef struct {
char *pwd;
int pwdlen;
int pwdpos;
} xorstate;
void xorfree(xorstate *state)
{
free(state->pwd);
free(state);
}
PyObject *xorsetup(PyObject *self, PyObject *args)
{
char *pwd;
int pwdlen;
xorstate *state;
PyObject *pystate;
if( !PyArg_ParseTuple(args,"s#",&pwd,&pwdlen) )
return NULL;
if( !( state = (xorstate*)malloc(sizeof(xorstate)) ) ) {
PyErr_SetString(PyExc_MemoryError,"Couldn't allocate XOR buffer.");
return NULL;
}
if( !( state->pwd = (char*)malloc(pwdlen) ) ) {
free(state);
PyErr_SetString(PyExc_MemoryError,"Couldn't allocate string buffer.");
return NULL;
}
memcpy(state->pwd,pwd,pwdlen);
state->pwdlen = pwdlen;
state->pwdpos = 0;
if( !( pystate = PyCObject_FromVoidPtr(state,xorfree) ) ) {
free(state->pwd);
free(state);
PyErr_SetString(PyExc_MemoryError,"Couldn't allocate PyCObject.");
return NULL;
}
return pystate;
}
PyObject *xor(PyObject *self, PyObject *args)
{
char *data, *xordata;
int datalen, curpos;
PyObject *pystate, *pydata;
xorstate *state;
if( !( PyArg_ParseTuple(args,"Os#",&pystate,&data,&datalen) ) )
return NULL;
if( !PyCObject_Check(pystate) ) {
PyErr_SetString(PyExc_ValueError,"First parameter must be a state.");
return NULL;
}
state = PyCObject_AsVoidPtr(pystate);
if( !( xordata = (char*)malloc(datalen) ) ) {
PyErr_SetString(PyExc_MemoryError,"Couldn't allocate xor array.");
return NULL;
}
memcpy(xordata,data,datalen);
for( curpos = 0; curpos < datalen; curpos++ )
xordata[curpos] = data[curpos] ^ state->pwd[(curpos+state->pwdpos)%
state->pwdlen];
state->pwdpos = (curpos+state->pwdpos) % state->pwdlen;
pydata = PyString_FromStringAndSize(xordata,datalen);
free(xordata);
return pydata;
}
static PyMethodDef XorCMethods[] = {
{"setup",xorsetup,METH_VARARGS,
"Sets up a structure which keeps track of the encryptions state."},
{"xor",xor,METH_VARARGS,
"XORs the passed buffer with a specified "},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initxorc()
{
Py_InitModule("xorc",XorCMethods);
}
Und der entsprechende setup.py-File:
setup.py
Code: Alles auswählen
# -*- coding: iso-8859-15 -*-
from distutils.core import setup, Extension
xorc = Extension('xorc',sources=['xorc.c'])
setup(name='xorc',version='0.1',
description='Encrypts a string using a simple XOR crypt.',
ext_modules=[xorc])
Das ganze ist folgendermaßen zu benutzen:
Code: Alles auswählen
modelnine@phoenix ~/xorc/build/lib.linux-x86_64-2.4 $ python
Python 2.4.2 (#1, Apr 3 2006, 12:10:45)
[GCC 3.4.6 (Gentoo 3.4.6, ssp-3.4.5-1.0, pie-8.7.9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import xorc
>>> state = xorc.setup("mein geheimes kennwort")
>>> xorc.xor(state,"Ich will diesen Text verschlüsseln; wer kann mir sagen was rauskommt?")
'$\x06\x01NW\x0e\t\x04E\r\x04\x00\x00E\x05E:\x0b\x0f\x1bR\x02\x08\x17\x1a\rH\x0b\x99\x1b\x16\x0c\x01\x0bH\x00\x1c\x00\x1cN\x1c\x0e\x1c\x1aM\x08\x00\x1c\x00\x14\x04\x0f\x00\x07M\x12\x12SK\x17\x0f\x1b\x04\x04\x1d\x19\x00\x11V'
>>> decstate = xorc.setup("mein geheimes kennwort")
>>> xorc.xor(decstate,'$\x06\x01NW\x0e\t\x04E\r\x04\x00\x00E\x05E:\x0b\x0f\x1bR\x02\x08\x17\x1a\rH\x0b\x99\x1b\x16\x0c\x01\x0bH\x00\x1c\x00\x1cN\x1c\x0e\x1c\x1aM\x08\x00\x1c\x00\x14\x04\x0f\x00\x07M\x12\x12SK\x17\x0f\x1b\x04\x04\x1d\x19\x00\x11V')
'Ich will diesen Text verschl\xfcsseln; wer kann mir sagen was rauskommt?'
>>>
modelnine@phoenix ~/xorc/build/lib.linux-x86_64-2.4 $
Ich hab einen kurzen Test gemacht der den Durchsatz auf meinem Rechner auf knapp 29MB/s misst (natürlich mit der Quelldatei im Plattencache...).
Viel Spaß damit!
EDIT by mawe: hab den C-Code eingefärbt
--- Heiko.