Cipher algorithm with Conway's Game of Life
Posted: November 17th, 2016, 6:57 am
We made cipher algorithm with Conway's Game of Life.
Conway's Game of Life's patterns almost converge, so cipher text cannot be deciphered, because it is not bijection.
So we added every rounds almost not to be duplicated.
You can find algorithm flowchart here.
Mod edit: placed [code] tags around code.
Conway's Game of Life's patterns almost converge, so cipher text cannot be deciphered, because it is not bijection.
So we added every rounds almost not to be duplicated.
You can find algorithm flowchart here.
Code: Select all
#include <stdio.h>
#define R 4 //array size
#define N 5 // repeat
/*key : CA convert, temp : temporary storage*/
int password[R][R];
int plaintext[R][R];
int key[N + 1][R + 2][R + 2], temp[R + 2][R + 2], k, i, j;
void lifegame(void);
void XOR(void);
void arr_print(int p);
void password_print(void);
int main(void)
{
input_plain();
printf("\n--------insert key-----------------\n");
lifegame();
for (k = 1; k <= N; k++) arr_print(k);
XOR();
for (k = 1; k <= N; k++) arr_print(k);
XOR_last();
password_print();
return 0;
}
int input_plain(void)
{
for (i = 1; i <= R; i++)
{
for (j = 1; j <= R; j++){
scanf("%d", &plaintext[i][j]);
}
}
}
void lifegame(void)
{
/*입력*/
for (i = 1; i <= R; i++)
{
for (j = 1; j <= R; j++)
{
scanf("%d", &key[0][i][j]);
temp[i][j] = 0;
}
}
/*put status quo to key[] in order*/
for (k = 0; k <= N; k++)
{
for (i = 1; i <= R; i++)
{
for (j = 1; j <= R; j++)
{
temp[i][j] = key[k][i - 1][j - 1] + key[k][i - 1][j] + key[k][i - 1][j + 1] + key[k][i][j - 1]
+ key[k][i][j + 1] + key[k][i + 1][j - 1] + key[k][i + 1][j] + key[k][i + 1][j + 1];
if (key[k][i][j] == 1)
key[k + 1][i][j] = temp[i][j] == 2 ? 1 : 0;
else
key[k + 1][i][j] = 0;
}
}
}
}
/*XOR*/
void XOR(void)
{
for (k = 0; k <= N; k++)
{
for (i = 1; i <= R; i++)
{
for (j = 1; j <= R; j++)
{
key[k + 1][i][j] = (key[k + 1][i][j] == key[k][i][j]) ? 0 : 1;
}
}
}
for (i = 1; i <= R; i++)
{
for (j = 1; j <= R; j++)
{
password[i - 1][j - 1] = key[N + 1][i][j];
}
}
}
int XOR_last(void){
for (i = 0; i <= N; i++){
for (j = 0; j <= N; j++){
if (password[i][j] != plaintext[i][j]){
password[i][j] = 1;
}
else{
password[i][j] = 0;
}
}
}
}
/*key array print*/
void arr_print(int p)
{
printf("---NUMBER %d---\n", p);
for (i = 1; i <= R; i++)
{
for (j = 1; j <= R; j++)
{
printf("%d ", key[p][i][j]);
}
printf("\n");
}
printf("----------------\n");
}
/*password print*/
void password_print(void)
{
printf("\n---password--- \n");
for (i = 0; i<R; i++)
{
for (j = 0; j<R; j++)
{
printf("%d ", password[i][j]);
}
printf("\n");
}
printf("-------------- \n");
}