예제 #1
0
파일: des.c 프로젝트: paulswtang/libcryptae
/*16 round feistel network with 64 bit block length and 56 bit keylength*/
int des(int key, int message){
    //split message into left and right halves
	//for-loop calling sboxes and keyschedule
	int left = //LEFT OF THE MESSAGE;
	int right = //RIGHT OF THE MESSAGE;
	int round;
	for(round = 0; round < 16; round++){
	    int oldleft = left;
        left = right;
		right = XOR(oldleft, mangler(keyschedule(key,round),right)); //fix this
    }
	
	return left CONCAT right; //fix this; perform concatenation
}
예제 #2
0
파일: decrypt.c 프로젝트: cadizm/crypto
/*
 * DES decryption of input from FILE pointer `fp' using key `sKey' and
 * tables specified in file `tablefile'.
 */
void decrypt(const char* sKey, const char* tablefile, FILE* fp)
{
    uint8_t buf[8];  /* block size is 64 bits */
    memset(buf, 0, 8 * sizeof(uint8_t));

    int keys[16][48];  /* represent each key bit as an integer */
    for (int i = 0; i < 16; ++i) {
        memset(keys[i], 0, 48 * sizeof(int));
    }

    int** table = tablecheck(tablefile);

    int* V = table[11];
    int* PC1 = table[12];
    int* PC2 = table[13];

    keyschedule(sKey, V, PC1, PC2, keys);
    reverse(keys, 16);

    int m[64];
    int res[64];

    memset(m, 0, 64 * sizeof(int));
    memset(res, 0, 64 * sizeof(int));

    while (!feof(fp)) {
        memset(buf, 0, 8 * sizeof(uint8_t));
        int nObj = 0;
        for (int i =0; i < 8; ++i) {
            nObj = fread(&buf[i], 1, 1, fp);
            if (nObj == 0) {
                if (i == 0) {
                    return;
                }
                else {
                    break;
                }
            }
        }

        unpack(buf, m);
        des(m, table, keys, res);
        pack(res, buf);

        fwrite(buf, 1, 8, stdout);
    }
}
예제 #3
0
파일: ubi.c 프로젝트: sbcd90/Skein
void ubiimplement(void)//function to implement the ubi chaining mode
{
	int originalsize,i1,mini,w,j,tempe[100000],tempe1[128],i,tempe2[127],maxaddvalue,tempe3[128],tweakbyte1[16];
	originalsize=sizeofplaintext;
	while((sizeofplaintext%32)!=0)//making the size of plaintext a multiple of 32 bytes
	{
		plaintext[sizeofplaintext]=0;
		sizeofplaintext=sizeofplaintext+1;
	}
	bytestowords(plaintext,0,sizeofplaintext);//converting from bytes to 64 bit words for use in threefish 
	for(i1=1;i1<=(sizeofplaintext/32);i1++)//the rounds in ubi chaining mode
	{
		mini=originalsize;//implementing the generation of tweak value for each round
		if(mini<(i*32))
		mini=(i*32);
		w=0;
		for(j=mini;j!=0;j=(j/2))//converting to bits
		{
			tempe[w]=(j%2);
			w=w+1;
		}
		for(i=0,j=127;i<128;i++,j--)//inverting input tweak
		{
			tempe1[i]=tweak[j];
		}
		addbyte(tempe1,tempe,128,w);//performing bit addition
		if(w>128)
		maxaddvalue=w;
		else
		maxaddvalue=128;
		if((i1-1)==0)
		{
			for(i=0;i<126;i++)//finding 2^126 
			{
				tempe2[i]=0;
			}
			tempe2[i]=1;
			addbyte(addvalue,tempe2,maxaddvalue,127);//adding bits
			if(maxaddvalue<127)//updating max array size
			maxaddvalue=127;
		}
		if(i1==(sizeofplaintext-1))
		{
			for(i=0;i<127;i++)//finding 2^127
			{
				tempe3[i]=0;
			}
			tempe3[i]=1;
			addbyte(addvalue,tempe3,maxaddvalue,128);//adding bits
			if(maxaddvalue<128)//updating max array size
			maxaddvalue=128;
		}
		changebyte(addvalue,maxaddvalue);//changing to byte format from bits
		for(i=0,j=15;i<16;i++,j--)//changing to lsb first mode
		{
			tweakbyte1[i]=tweakbyte[j];
		}
		bytestowords(blockcipherkey,1,32);//changing from bytes to 64-bit words for threefish
		bytestowords(tweakbyte1,2,16);
		keyschedule();//generating key schedule
		rounds();//performing rounds in threefish
		for(i=0;i<32;i++)//generating block cipher key for next ubi round
		{
			blockcipherkey[i]=ciphertext[i];
			if(move1<originalsize)
			{
				entireciphertext[move1]=ciphertext[i];
				move1=move1+1;
			}
		}
	}
}