Page 1 of 1

Cipher algorithm with Conway's Game of Life

Posted: November 17th, 2016, 6:57 am
by sailor3947
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.
rsTDFxB.png
rsTDFxB.png (95.66 KiB) Viewed 123 times

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");
}
Mod edit: placed [code] tags around code.

Re: Cipher algorithm with Conway's Game of Life

Posted: November 19th, 2016, 6:50 pm
by toroidalet
Suggestion: Put things like this in code boxes like this:

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");
}
I really like the idea. Keep going! :mrgreen:
Also, it's python, right? When I run it using Golly, it doesn't work. Is there something I'm missing?

Re: Cipher algorithm with Conway's Game of Life

Posted: November 19th, 2016, 8:10 pm
by shouldsee
toroidalet wrote:Also, it's python, right? When I run it using Golly, it doesn't work. Is there something I'm missing?
It's C language in source code, you need studio or other c compiler to compile and then run it.