Ejemplo n.º 1
0
//==============================================================================
void ShiftRows(uint8_t *s, uint8_t direct) //Функция сдивига строк
{
   uint8_t temp[8]; //Временные данные
   uint8_t i , j; //Счетчики
   uint8_t shfts[3][4]; //Матрица позиций сдвига
   
   for(i=0;i<3;i++)
   {
     for(j=0;j<4;j++)
     {
       if(i==2 && j==3) shfts[i][j] = 4;
       else shfts[i][j] = j;
       
     }
   }
   
   
   for(i=0;i<4;i++)
   {
     for(j=0;j<Nb;j++) temp[j] = s[j*4+i];
        shiftrow(temp , shfts[Nb/2-2][i] , direct);
        
     for(j=0;j<Nb;j++) s[j*4+i] = temp[j];
   }
  
}
Ejemplo n.º 2
0
void
MessageEncryption::encrypt(std::string imgpath,std::string outpath){
    std::default_random_engine rand (this->key);
    int currand; int i, j;
    int width, height;
    FILE* in, *out; gdImagePtr img;
    printf("o\n");
    int ext = getexten(imgpath);

    printf("a\n");
    
    in = fopen(imgpath.c_str(),"rb");
    if(ext==0){
        img=gdImageCreateFromJpeg(in);
    } else if(ext==1){
        img=gdImageCreateFromPng(in);
    } else{
        exit(1);
    }
    fclose(in);

    printf("b\n");

    width = gdImageSX(img); height = gdImageSY(img);
    
    for(i=0;i<ITER_COUNT;i++){
        currand = rand()%FLIP_CHANCE;
        if(currand==0){ // flip horizontally
            fliphoriz(img);
        } else if(currand==1){ // flip vertically
            flipvert(img);
        } else if(currand<=1+FLIP_CHANCE/2){ // shift some rows
            for(j=0;j<=(currand%(width/3));j++){
                shiftcol(img,(3*i+j)%width,(7*currand+4*i)%height);
            }
        } else{  // shift some columns
            for(j=0;j<=(currand%(height/3));j++){
                shiftrow(img,(3*i+j)%height,(7*currand+4*i)%width);
            }
        }
    }
    printf("c\n");
    ext = getexten(outpath);
    out = fopen(outpath.c_str(),"wb");
    if(ext==0){
        gdImageJpeg(img,out,-1);
    } else if(ext==1){
        gdImagePng(img,out);
    } else{
        exit(1);
    }
    fclose(out); gdImageDestroy(img);
}
int main(){
	int rounds, i, j, count, numberround, answer, rconround = 0, subbyteround = 0;;
	char plaintext[17] = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
	char key[17] = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
	char index[16][3];
	char indexkey[16][3];
	char b[3], a[3];
	printf("Input Text: ");
	gets(plaintext);
	printf("Input Key: ");
	scanf(" %[^\n]s\n", key);
	rounds = ceil(strlen(plaintext)/16);
	for(i=0; i<16; i++){
		sprintf(a, "%x", plaintext[i]); /* keep char ascii to hex base */
		sprintf(b, "%x", key[i]);
		strcpy(index[i], a);
		strcpy(indexkey[i], b);
		//printf("%x\n", index[i]);
		//printf("%s\n", indexkey[i]);
	}
	for(i=0; i<16; i++){//we do add round key first before do 10 loop
			//printf("%d\n", (((tonum(index[i][0]))*10)+(tonum(index[i][1]))));
			answer = (((tonum(index[i][0]))*10)+(tonum(index[i][1])))^(((tonum(indexkey[i][0]))*10)+(tonum(indexkey[i][1])));
			printf("%d\n", answer);
			sprintf(a, "%x", answer);
			printf("%s\n", a);
			strcpy(index[i], a);
			//printf("%s\n", index[i]);
	}
	for(numberround=1; numberround<=10; numberround++){
		printf("%d %d\n", rconround,subbyteround);
		if(numberround==1){
			sub_byte_key(indexkey);
			roundkey(matrixkey, rconround);
		}
		else{
			roundkey(matrixkey, rconround);
		}
		sub_byte(index, subbyteround);
		printf("roundkey:\n");
		for(i=0; i<4; i++){
			for(j=0; j<4; j++){
				printf("%x ", matrixkey[i][j]);
			}
			printf("\n");
		}
		printf("-------------------------------------------\n");
		printf("Subbyte:\n");
		for(i=0; i<4; i++){
			for(j=0; j<4; j++){
				printf("%x ", matrix[i][j]);
			}
			printf("\n");
		}
		printf("-------------------------------------------\n");
		shiftrow();
		printf("shiftrow value:\n");
		for(i=0; i<4; i++){
			for(j=0; j<4; j++){
				printf("%x ", matrix[i][j]);
			}
			printf("\n");
		}
		printf("-------------------------------------------\n");
		if(numberround<10){
			mixcolumn();
			printf("mixcolumn value:\n");
			for(i=0; i<4; i++){
				for(j=0; j<4; j++){
					printf("%x ", matrix[i][j]);
				}
				printf("\n");
			}
		}
		printf("-------------------------------------------\n");
		addroundkey();
		printf("Addroundkey value:\n");
		for(i=0; i<4; i++){
			for(j=0; j<4; j++){
				printf("%c", matrix[j][i]);
			}
			//printf("\n");
		}
		printf("\n");
		subbyteround++;
		rconround++;
	}

}	
int main(){
	int rounds, i, j, count, numberround;
	char plaintext[17] = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
	char key[17] = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
	char index[16][3];
	char indexkey[16][3];
	char b[3], a[3];
	printf("Input Text: ");
	gets(plaintext);
	printf("Input Key: ");
	scanf(" %[^\n]s\n", key);
	rounds = ceil(strlen(plaintext)/16);
	for(i=0; i<16; i++){
		sprintf(a, "%x", plaintext[i]); /* keep char ascii to hex base */
		sprintf(b, "%x", key[i]);
		strcpy(index[i], a);
		strcpy(indexkey[i], b);
	}
	for(numberround=1; numberround<=10; numberround++){
		if(numberround==1){
			sub_byte_key(indexkey);
			roundkey(matrixkey);
		}
		else{
			roundkey(matrixkey);
		}
		sub_byte(index);
		printf("roundkey:\n");
		for(i=0; i<4; i++){
			for(j=0; j<4; j++){
				printf("%x ", matrixkey[i][j]);
			}
			printf("\n");
		}
		printf("-------------------------------------------\n");
		printf("Subbyte:\n");
		for(i=0; i<4; i++){
			for(j=0; j<4; j++){
				printf("%x ", matrix[i][j]);
			}
			printf("\n");
		}
		printf("-------------------------------------------\n");
		shiftrow();
		printf("shiftrow value:\n");
		for(i=0; i<4; i++){
			for(j=0; j<4; j++){
				printf("%x ", matrix[i][j]);
			}
			printf("\n");
		}
		printf("-------------------------------------------\n");
		if(numberround<10){
			mixcolumn();
			printf("mixcolumn value:\n");
			for(i=0; i<4; i++){
				for(j=0; j<4; j++){
					printf("%x ", matrix[i][j]);
				}
				printf("\n");
			}
		}
		printf("-------------------------------------------\n");
		addroundkey();
		printf("Addroundkey value:\n");
		for(i=0; i<4; i++){
			for(j=0; j<4; j++){
				printf("%c", cipher[i][j]);
			}
		}
		printf("\n");
	}

/*
	for(i=0; i<16; i++){
		sprintf(a, "%x", plaintext[i]); //keep char ascii to hex base
		sprintf(b, "%x", key[i]);
		strcpy(index[i], a);
		strcpy(indexkey[i], b);
	}
	roundkey(indexkey);
	sub_byte(index);
	printf("matrixkey:\n");
	for(i=0; i<4; i++){
		for(j=0; j<4; j++){
			printf("%x ", matrixkey[i][j]);
		}
		printf("\n");
	}
	printf("-------------------------------------------\n");
	printf("matrix:\n");
	for(i=0; i<4; i++){
		for(j=0; j<4; j++){
			printf("%x ", matrix[i][j]);
		}
		printf("\n");
	}
	printf("-------------------------------------------\n");
	shiftrow();
	printf("shiftrow value:\n");
	for(i=0; i<4; i++){
		for(j=0; j<4; j++){
			printf("%x ", matrix[i][j]);
		}
		printf("\n");
	}
	printf("-------------------------------------------\n");
	mixcolumn();
	printf("mixcolumn value:\n");
	for(i=0; i<4; i++){
		for(j=0; j<4; j++){
			printf("%x ", matrix[i][j]);
		}
		printf("\n");
	}
	printf("-------------------------------------------\n");
	addroundkey();
	printf("Addroundkey value:\n");
	for(i=0; i<4; i++){
		for(j=0; j<4; j++){
			printf("%x ", matrix[i][j]);
		}
		printf("\n");
	}
	*/

}