#include<stdio.h>
#include<string.h>
#include<ctype.h>
int removerepeated(int size,int a[]);
int insertelementat(int position,int a[],int size);
void main()
{
int i,j,k,numstr[100],numcipher[100],numkey[100],lenkey,templen,tempkey[100],flag=-1,size,cipherkey[5][5],lennumstr,row1,row2,col1,col2;
char str[100],key[100];
printf("Enter a string\n");
gets(str);
//converting entered string to Capital letters
for(i=0,j=0;i<strlen(str);i++)
{
if(str[i]!=' ')
{
str[j]=toupper(str[i]);
j++;
}
}
str[j]='\0';
printf("Entered String is %s\n",str);
//Storing string in terms of ascii and to restore spaces I used -20
size=strlen(str);
for(i=0;i<size;i++)
{
if(str[i]!=' ')
numstr[i]=str[i]-'A';
}
lennumstr=i;
//Key processing
printf("Enter the key (Non repeated elements if possible)\n");
gets(key);
//converting entered key to Capital letters
for(i=0,j=0;i<strlen(key);i++)
{
if(key[i]!=' ')
{
key[j]=toupper(key[i]);
j++;
}
}
key[j]='\0';
printf("%s\n",key);
//Storing key in terms of ascii
k=0;
for(i=0;i<strlen(key)+26;i++)
{
if(i<strlen(key))
{
if(key[i]=='J')
{
flag=8;
printf("%d",flag);
}
numkey[i]=key[i]-'A';
}
else
{
if(k!=9 && k!=flag)//Considering I=J and taking I in place of J except when J is there in key ignoring I
{
numkey[i]=k;
}
k++;
}
}
templen=i;
lenkey=removerepeated(templen,numkey);
printf("Entered key converted according to Play Fair Cipher rule\n");
for(i=0;i<lenkey;i++)
{
printf("%c",numkey[i]+'A');
}
printf("\n");
//Arranging the key in 5x5 grid
k=0;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
cipherkey[i][j]=numkey[k];
k++;
}
}
printf("Arranged key\n");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
printf("%c ",cipherkey[i][j]+'A');
}
printf("\n");
}
//Message Processing
for(i=0;i<lennumstr;i+=2)
{
if(numstr[i]==numstr[i+1])
{
insertelementat(i+1,numstr,lennumstr);
lennumstr++;
}
}
if(lennumstr%2!=0)
{
insertelementat(lennumstr,numstr,lennumstr);
lennumstr++;
}
printf("Entered String/Message After Processing according to Play fair cipher rule\n");
for(i=0;i<lennumstr;i++)
{
printf("%c",numstr[i]+'A');
}
for(k=0;k<lennumstr;k+=2)
{
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(numstr[k]==cipherkey[i][j])
{
row1=i;
col1=j;
}
if(numstr[k+1]==cipherkey[i][j])
{
row2=i;
col2=j;
}
}
}
if(row1==row2)
{
col1=(col1+1)%5;
col2=(col2+1)%5;
numcipher[k]=cipherkey[row1][col1];
numcipher[k+1]=cipherkey[row2][col2];
}
if(col1==col2)
{
row1=(row1+1)%5;
row2=(row2+1)%5;
numcipher[k]=cipherkey[row1][col1];
numcipher[k+1]=cipherkey[row2][col2];
}
if(row1!=row2&&col1!=col2)
{
numcipher[k]=cipherkey[row1][col2];
numcipher[k+1]=cipherkey[row2][col1];
}
}
printf("\nCipher Text is\n");
for(i=0;i<lennumstr;i++)
{
printf("%c",numcipher[i]+'A');
}
printf("\n");
}
int removerepeated(int size,int a[])
{
int i,j,k;
for(i=0;i<size;i++)
{
for(j=i+1;j<size;)
{
if(a[i]==a[j])
{
for(k=j;k<size;k++)
{
a[k]=a[k+1];
}
size--;
}
else
{
j++;
}
}
}
return(size);
}
int insertelementat(int position,int a[],int size)
{
int i,insitem=23;
int temp[size+1];
for(i=0;i<=size;i++)
{
if(i<position)
{
temp[i]=a[i];
}
if(i>position)
{
temp[i]=a[i-1];
}
if(i==position)
{
temp[i]=insitem;
}
}
for(i=0;i<=size;i++)
{
a[i]=temp[i];
}
return(size);
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RyaW5nLmg+CiNpbmNsdWRlPGN0eXBlLmg+CmludCByZW1vdmVyZXBlYXRlZChpbnQgc2l6ZSxpbnQgYVtdKTsKaW50IGluc2VydGVsZW1lbnRhdChpbnQgcG9zaXRpb24saW50IGFbXSxpbnQgc2l6ZSk7CnZvaWQgbWFpbigpCnsKIGludCBpLGosayxudW1zdHJbMTAwXSxudW1jaXBoZXJbMTAwXSxudW1rZXlbMTAwXSxsZW5rZXksdGVtcGxlbix0ZW1wa2V5WzEwMF0sZmxhZz0tMSxzaXplLGNpcGhlcmtleVs1XVs1XSxsZW5udW1zdHIscm93MSxyb3cyLGNvbDEsY29sMjsKIGNoYXIgc3RyWzEwMF0sa2V5WzEwMF07CiBwcmludGYoIkVudGVyIGEgc3RyaW5nXG4iKTsKIGdldHMoc3RyKTsKIC8vY29udmVydGluZyBlbnRlcmVkIHN0cmluZyB0byBDYXBpdGFsIGxldHRlcnMKIGZvcihpPTAsaj0wO2k8c3RybGVuKHN0cik7aSsrKQogewogIGlmKHN0cltpXSE9JyAnKQogIHsKICAgc3RyW2pdPXRvdXBwZXIoc3RyW2ldKTsKICAgaisrOwogIH0KCiB9CiBzdHJbal09J1wwJzsKcHJpbnRmKCJFbnRlcmVkIFN0cmluZyBpcyAlc1xuIixzdHIpOwogLy9TdG9yaW5nIHN0cmluZyBpbiB0ZXJtcyBvZiBhc2NpaSBhbmQgdG8gcmVzdG9yZSBzcGFjZXMgSSB1c2VkIC0yMAogc2l6ZT1zdHJsZW4oc3RyKTsKIGZvcihpPTA7aTxzaXplO2krKykKIHsKICBpZihzdHJbaV0hPScgJykKICBudW1zdHJbaV09c3RyW2ldLSdBJzsKIH0KIGxlbm51bXN0cj1pOwogLy9LZXkgcHJvY2Vzc2luZwoKIHByaW50ZigiRW50ZXIgdGhlIGtleSAoTm9uIHJlcGVhdGVkIGVsZW1lbnRzIGlmIHBvc3NpYmxlKVxuIik7CiBnZXRzKGtleSk7CiAvL2NvbnZlcnRpbmcgZW50ZXJlZCBrZXkgdG8gQ2FwaXRhbCBsZXR0ZXJzCiBmb3IoaT0wLGo9MDtpPHN0cmxlbihrZXkpO2krKykKIHsKICBpZihrZXlbaV0hPScgJykKICB7CiAgIGtleVtqXT10b3VwcGVyKGtleVtpXSk7CiAgIGorKzsKICB9CiB9CiBrZXlbal09J1wwJzsKIHByaW50ZigiJXNcbiIsa2V5KTsKIC8vU3RvcmluZyBrZXkgaW4gdGVybXMgb2YgYXNjaWkKIGs9MDsKIGZvcihpPTA7aTxzdHJsZW4oa2V5KSsyNjtpKyspCiB7CiAgaWYoaTxzdHJsZW4oa2V5KSkKICB7CiAgIGlmKGtleVtpXT09J0onKQogICB7CiAgICBmbGFnPTg7CiAgICBwcmludGYoIiVkIixmbGFnKTsKICAgfQogICAgICAgbnVta2V5W2ldPWtleVtpXS0nQSc7CiAgfQogIGVsc2UKICB7CiAgICBpZihrIT05ICYmIGshPWZsYWcpLy9Db25zaWRlcmluZyBJPUogYW5kIHRha2luZyBJIGluIHBsYWNlIG9mIEogZXhjZXB0IHdoZW4gSiBpcyB0aGVyZSBpbiBrZXkgaWdub3JpbmcgSQogICAgewoJICAgIG51bWtleVtpXT1rOwogICAgICB9CiAgICAgIGsrKzsKCiAgfQogfQogdGVtcGxlbj1pOwogbGVua2V5PXJlbW92ZXJlcGVhdGVkKHRlbXBsZW4sbnVta2V5KTsKIHByaW50ZigiRW50ZXJlZCBrZXkgY29udmVydGVkIGFjY29yZGluZyB0byBQbGF5IEZhaXIgQ2lwaGVyIHJ1bGVcbiIpOwogZm9yKGk9MDtpPGxlbmtleTtpKyspCiB7CiAgICAgcHJpbnRmKCIlYyIsbnVta2V5W2ldKydBJyk7CiB9CiBwcmludGYoIlxuIik7CiAvL0FycmFuZ2luZyB0aGUga2V5IGluIDV4NSBncmlkCiBrPTA7CiBmb3IoaT0wO2k8NTtpKyspCiB7CiAgZm9yKGo9MDtqPDU7aisrKQogIHsKICAgY2lwaGVya2V5W2ldW2pdPW51bWtleVtrXTsKICAgaysrOwogIH0KIH0KCiBwcmludGYoIkFycmFuZ2VkIGtleVxuIik7CiBmb3IoaT0wO2k8NTtpKyspCiB7CiAgZm9yKGo9MDtqPDU7aisrKQogIHsKCiAgIHByaW50ZigiJWMgIixjaXBoZXJrZXlbaV1bal0rJ0EnKTsKCiAgfQogIHByaW50ZigiXG4iKTsKIH0KCiAgIC8vTWVzc2FnZSBQcm9jZXNzaW5nCgogICBmb3IoaT0wO2k8bGVubnVtc3RyO2krPTIpCiAgIHsKICAgICAgaWYobnVtc3RyW2ldPT1udW1zdHJbaSsxXSkKICAgICAgewogICAgICAgaW5zZXJ0ZWxlbWVudGF0KGkrMSxudW1zdHIsbGVubnVtc3RyKTsKICAgICAgIGxlbm51bXN0cisrOwogICAgICB9CiAgIH0KICAgaWYobGVubnVtc3RyJTIhPTApCiAgIHsKICAgIGluc2VydGVsZW1lbnRhdChsZW5udW1zdHIsbnVtc3RyLGxlbm51bXN0cik7CiAgICBsZW5udW1zdHIrKzsKICAgfQogICBwcmludGYoIkVudGVyZWQgU3RyaW5nL01lc3NhZ2UgQWZ0ZXIgUHJvY2Vzc2luZyBhY2NvcmRpbmcgdG8gUGxheSBmYWlyIGNpcGhlciBydWxlXG4iKTsKICAgZm9yKGk9MDtpPGxlbm51bXN0cjtpKyspCiAgIHsKICAgIHByaW50ZigiJWMiLG51bXN0cltpXSsnQScpOwogICB9CiAgIGZvcihrPTA7azxsZW5udW1zdHI7ays9MikKICAgewogICAgZm9yKGk9MDtpPDU7aSsrKQogICAgewogICAgIGZvcihqPTA7ajw1O2orKykKICAgICB7CiAgICAgIGlmKG51bXN0cltrXT09Y2lwaGVya2V5W2ldW2pdKQogICAgICB7Cgkgcm93MT1pOwoJIGNvbDE9ajsKICAgICAgfQogICAgICBpZihudW1zdHJbaysxXT09Y2lwaGVya2V5W2ldW2pdKQogICAgICB7Cgkgcm93Mj1pOwoJIGNvbDI9ajsKICAgICAgfQoKICAgICB9CiAgICB9CiAgICBpZihyb3cxPT1yb3cyKQogICAgewogICAgIGNvbDE9KGNvbDErMSklNTsKICAgICBjb2wyPShjb2wyKzEpJTU7CiAgICAgbnVtY2lwaGVyW2tdPWNpcGhlcmtleVtyb3cxXVtjb2wxXTsKICAgICBudW1jaXBoZXJbaysxXT1jaXBoZXJrZXlbcm93Ml1bY29sMl07CiAgICB9CiAgICBpZihjb2wxPT1jb2wyKQogICAgewogICAgIHJvdzE9KHJvdzErMSklNTsKICAgICByb3cyPShyb3cyKzEpJTU7CiAgICAgbnVtY2lwaGVyW2tdPWNpcGhlcmtleVtyb3cxXVtjb2wxXTsKICAgICBudW1jaXBoZXJbaysxXT1jaXBoZXJrZXlbcm93Ml1bY29sMl07CiAgICB9CiAgICBpZihyb3cxIT1yb3cyJiZjb2wxIT1jb2wyKQogICAgewogICAgIG51bWNpcGhlcltrXT1jaXBoZXJrZXlbcm93MV1bY29sMl07CiAgICAgbnVtY2lwaGVyW2srMV09Y2lwaGVya2V5W3JvdzJdW2NvbDFdOwogICAgfQogICB9CiAgIHByaW50ZigiXG5DaXBoZXIgVGV4dCBpc1xuIik7CgogICBmb3IoaT0wO2k8bGVubnVtc3RyO2krKykKICAgewogICAgICBwcmludGYoIiVjIixudW1jaXBoZXJbaV0rJ0EnKTsKICAgfQogICBwcmludGYoIlxuIik7CgoKfQoKaW50IHJlbW92ZXJlcGVhdGVkKGludCBzaXplLGludCBhW10pCnsKIGludCBpLGosazsKIGZvcihpPTA7aTxzaXplO2krKykKICB7CiBmb3Ioaj1pKzE7ajxzaXplOykKIHsKICAgIGlmKGFbaV09PWFbal0pCiAgICB7CgogICAgIGZvcihrPWo7azxzaXplO2srKykKICAgICB7CiAgICAgIGFba109YVtrKzFdOwogICAgIH0KCSBzaXplLS07Cgl9CiAgICBlbHNlCiAgICB7CiAgICAgIGorKzsKICAgICB9CiB9CiB9CnJldHVybihzaXplKTsKfQoKaW50IGluc2VydGVsZW1lbnRhdChpbnQgcG9zaXRpb24saW50IGFbXSxpbnQgc2l6ZSkKewogICAgICAgaW50IGksaW5zaXRlbT0yMzsKICAgICAgIGludCB0ZW1wW3NpemUrMV07CiAgICBmb3IoaT0wO2k8PXNpemU7aSsrKQoJewoJaWYoaTxwb3NpdGlvbikKCXsKCSAgICB0ZW1wW2ldPWFbaV07Cgl9CglpZihpPnBvc2l0aW9uKQoJewoJIHRlbXBbaV09YVtpLTFdOwoJfQoJaWYoaT09cG9zaXRpb24pCgl7CgkgICAgdGVtcFtpXT1pbnNpdGVtOwoJfQoKCX0KCglmb3IoaT0wO2k8PXNpemU7aSsrKQoJewoJIGFbaV09dGVtcFtpXTsKCSB9CiByZXR1cm4oc2l6ZSk7Cn0=