Ejemplo n.º 1
0
void DES (const int32_t *keysArrayPtr, int32_t Count, char * encryptData,short mode)
{
	EncryptBlk *EncryptDataPtr;
	EncryptBlk resultData;
	EncryptBlk *ReturnData;
	short		swapCount;
	uint32_t	fResult;
	uint32_t	gTemp;
	uint32_t	keyHi;
	uint32_t	keyLo;
	uint32_t	*keyPtr;

	EncryptDataPtr	= (EncryptBlk *) encryptData;
	ReturnData = EncryptDataPtr;

	for ( ;Count > 0; Count -= kkeySize)
	{
		InitialPermutation(EncryptDataPtr, &resultData );

		if (mode == kEncrypt)
			keyPtr =  (uint32_t*)keysArrayPtr;
		else /* must be decrypt */
			keyPtr =  TheLastKey(keysArrayPtr); /* start at last key in array */

		for (swapCount = knumKeys; swapCount != 0; swapCount--)
		{
			if (mode == kEncrypt)
			{
				keyHi = *keyPtr++;
				keyLo = *keyPtr++;
			}
			else /* must be decrypt */
			{
				keyLo = *keyPtr--;
				keyHi = *keyPtr--;
			}
			
			fResult = FRK(resultData.keyLo,keyHi,keyLo);
			resultData.keyHi = resultData.keyHi ^ fResult;
			if (swapCount > 1) /* EXchange is multi-line macro and requires {}*/
			{
				EXchange(resultData.keyHi,resultData.keyLo);
			} 
		}
			
		EXchange(resultData.keyHi,resultData.keyLo);
		Permute(&resultData,(int32_t*)&N_IPInvTbl);
		EncryptDataPtr = (EncryptBlk *) (((char*) EncryptDataPtr) + kkeySize);   
	}

	ReturnData->keyLo = htonl(resultData.keyLo);
	ReturnData->keyHi = htonl(resultData.keyHi);
}
Ejemplo n.º 2
0
//Decryption Function
int decryption(int cipher64Bit[], int pc1Output56BitKey[], int plainText[])
{
	int iteration = 0;
	int	ipOutput64Bit[64];
	int permutationChoiceMatrix2[48]={14,17,11,24,1,5,3,28,
			15,6,21,10,23,19,12,4,
			26,8,16,7,27,20,13,2,
			41,52,31,37,47,55,30,40,
			51,45,33,48,44,49,39,56,
			34,53,46,42,50,36,29,32};
	int leftKey28Bit[28];
	int rightKey28Bit[28];
	int shiftedLeftKey28Bit[28],shiftedRightKey28Bit[28],key56Bit[56],key48Bit[48];
	int initialPermutationMatrix[64]={58,50,42,34,26,18,10,2,
			60,52,44,36,28,20,12,4,
			62,54,46,38,30,22,14,6,
			64,56,48,40,32,24,16,8,
			57,49,41,33,25,17,9,1,
			59,51,43,35,27,19,11,3,
			61,53,45,37,29,21,13,5,
			63,55,47,39,31,23,15,7};

	int leftN32Bit[32],rightN32Bit[32];

	int inverseInitialPermutationMatrix[64]={40, 8 ,48, 16, 56, 24, 64, 32,
			39, 7, 47, 15, 55, 23, 63, 31,
			38, 6, 46, 14, 54, 22, 62, 30,
			37 ,5 ,45, 13, 53, 21, 61, 29,
			36, 4, 44, 12, 52, 20, 60, 28,
			35, 3, 43, 11, 51, 19, 59, 27,
			34, 2 ,42, 10, 50, 18, 58, 26,
			33, 1 ,41, 9 ,49, 17, 57, 25};
	int eBitSelectionMatrix[48]={32,1,2,3,4,5,
			4,5,6,7,8,9,
			8,9,10,11,12,13,
			12,13,14,15,16,17,
			16,17,18,19,20,21,
			20,21,22,23,24,25,
			24,25,26,27,28,29,
			28,29,30,31,32,1};
	int rightN48Bit[48],xorOutput48bit[48],sBoxOutput32bit[32];

	int sBox1[4][16]={
			{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},
			{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},
			{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},
			{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}};

	int sBox2[4][16]={
			{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},
			{3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},
			{0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},
			{13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}};

	int sBox3[4][16]={
			{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},
			{13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},
			{13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},
			{1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}};

	int sBox4[4][16]={
			{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},
			{13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},
			{10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},
			{3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}};

	int sBox5[4][16]={
			{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},
			{14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},
			{4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},
			{11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}};

	int sBox6[4][16]={
			{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},
			{10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},
			{9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},
			{4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}};

	int sBox7[4][16]={
			{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},
			{13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},
			{1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},
			{6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}};

	int sBox8[4][16]={
			{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},
			{1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},
			{7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},
			{2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}};

	int perMatrix[32]={16 ,  7,  20,  21,
			29,  12,  28,  17,
			1 , 15,  23,  26,
			5 , 18 , 31,  10,
			2 ,  8 , 24,  14,
			32 , 27  , 3 ,  9,
			19 , 13 , 30  , 6,
			22 , 11,   4 , 25};

	int perMatrixOutput32bit[32];
	int rightNOutput32bit[32];
	int siftMode[16]={SHIFT_1,SHIFT_1, SHIFT_2, SHIFT_2, SHIFT_2, SHIFT_2, SHIFT_2,
			SHIFT_2, SHIFT_1, SHIFT_2, SHIFT_2, SHIFT_2, SHIFT_2, SHIFT_2, SHIFT_2, SHIFT_1};
	int output64Bit[64];
	int x=0,y=0,z=0;
	int key[16][48];
	int keyIndex;


	//printArray(cipher, 64, "cipher");
	//printArray(key64Bit, 64, "key64Bit");



	//***********DECRYPTION IMPLEMENTATION STARTS FROM HERE*************//


	//16 keys calculation
	for(iteration= 0; iteration<16;iteration++)
	{
		//printf("\n Key : %d",iteration+1);

		//STEP 1 A
		divide56To28( pc1Output56BitKey,leftKey28Bit,rightKey28Bit);
		//printArray(leftKey28Bit, 28, "leftKey28Bit");
		//printArray(rightKey28Bit, 28, "rightKey28Bit");

		//STEP 1 B1
		leftShift28(leftKey28Bit,shiftedLeftKey28Bit,siftMode[iteration]);
		//printArray(shiftedLeftKey28Bit, 28, "shiftedLeftKey28Bit");

		//STEP 1 B2
		leftShift28(rightKey28Bit,shiftedRightKey28Bit,siftMode[iteration]);
		//printArray(shiftedRightKey28Bit, 28, "shiftedRightKey28Bit");

		//STEP 1 C
		concatenate28To56(shiftedLeftKey28Bit, shiftedRightKey28Bit, key56Bit);
		//printArray(key56Bit, 56, "key56Bit");

		for(y=0;y<56;y++)
		{
			pc1Output56BitKey[y]=key56Bit[y];
		}

		//STEP 1 D
		permutedChoice2( permutationChoiceMatrix2,  key56Bit,  key48Bit);
		//printArray(key48Bit, 48, "key48Bit");

		for(z=0;z<48;z++)
		{
			key[iteration][z] = key48Bit[z];
		}

	}

	//STEP 2
	InitialPermutation(initialPermutationMatrix,cipher64Bit, ipOutput64Bit);
	//printArray(ipOutput64Bit,64, "ipOutput64Bit");

	//STEP 3
	divide64To32(ipOutput64Bit,leftN32Bit,rightN32Bit);
	//printArray(leftN32Bit, 32, "leftN32Bit");
	//printArray(rightN32Bit, 32, "rightN32Bit");

	for(iteration= 0,keyIndex=15; iteration<16;iteration++,keyIndex--)
	{
		//printf("\n Iteration : %d",iteration+1);

		//STEP 4 E
		eBitSelection( eBitSelectionMatrix,  rightN32Bit,  rightN48Bit);
		//printArray(rightN48Bit, 48, "rightN48Bit");

		//STEP 4 F
		XOR48bit(rightN48Bit, key[keyIndex], xorOutput48bit);
		//printArray(xorOutput48bit, 48, "xorOutput48bit");

		//STEP 4 G
		sBoxSelection( sBox1, sBox2, sBox3, sBox4,
				sBox5, sBox6, sBox7, sBox8, xorOutput48bit, sBoxOutput32bit);
		//printArray(sBoxOutput32bit, 32, "sBoxOutput32bit");

		//STEP 4 H
		functionPermutationSelection( perMatrix, sBoxOutput32bit, perMatrixOutput32bit);
		//printArray(perMatrixOutput32bit, 32, "perMatrixOutput32bit");

		//STEP 4 I
		rightN( leftN32Bit, perMatrixOutput32bit, rightNOutput32bit);
		//printArray(rightNOutput32bit, 32, "rightNOutput32bit");



		if(iteration<=14)
		{
			//STEP 4 J
			for(x=0;x<32;x++)
			{
				leftN32Bit[x]=rightN32Bit[x];
			}
			//printArray(leftN32Bit, 32, "leftN32Bit");

			//STEP 4 K
			for(x=0;x<32;x++)
			{
				rightN32Bit[x]=rightNOutput32bit[x];
			}
			//printArray(rightN32Bit, 32, "rightN32Bit");
		}
		else
		{
			for(x=0;x<32;x++)
			{
				leftN32Bit[x]=rightNOutput32bit[x];
			}
			//printArray(leftN32Bit, 32, "leftN32Bit");

		}

	}

	//STEP 5
	concatenate32To64(leftN32Bit, rightN32Bit, output64Bit);
	//printArray(output64Bit,64, "output64Bit");

	//STEP 6
	inverseInitialPermutation(inverseInitialPermutationMatrix,output64Bit, plainText);
	//printArray(plainText,64, "plainText");


	return 0;

}