CNS Practical-6

#include <stdio.h>
#include <string.h>
#include <ctype.h>

char matrix[5][5];

void createMatrix(char key[]) {
    int used[26] = {0};
    int i, j, k = 0;
    char ch;

    for (i = 0; i < strlen(key); i++) {
        ch = toupper(key[i]);
        if (ch == 'J') ch = 'I';
        if (!isalpha(ch)) continue;

        if (!used[ch - 'A']) {
            matrix[k / 5][k % 5] = ch;
            used[ch - 'A'] = 1;
            k++;
        }
    }

    for (i = 0; i < 26; i++) {
        if (i + 'A' == 'J') continue;
        if (!used[i]) {
            matrix[k / 5][k % 5] = i + 'A';
            k++;
        }
    }
}

void find(char c, int *row, int *col) {
    int i, j;
    if (c == 'J') c = 'I';
    for (i = 0; i < 5; i++)
        for (j = 0; j < 5; j++)
            if (matrix[i][j] == c) {
                *row = i;
                *col = j;
                return;
            }
}

void encrypt(char text[]) {
    int i, row1, col1, row2, col2;
    char a, b;
    printf("Encrypted: ");
    for (i = 0; i < strlen(text); i += 2) {
        a = toupper(text[i]);
        b = toupper(text[i + 1]);
        if (a == 'J') a = 'I';
        if (b == 'J') b = 'I';
        if (a == b) b = 'X';  // insert filler letter

        find(a, &row1, &col1);
        find(b, &row2, &col2);

        if (row1 == row2) {
            printf("%c%c", matrix[row1][(col1 + 1) % 5], matrix[row2][(col2 + 1) % 5]);
        } else if (col1 == col2) {
            printf("%c%c", matrix[(row1 + 1) % 5][col1], matrix[(row2 + 1) % 5][col2]);
        } else {
            printf("%c%c", matrix[row1][col2], matrix[row2][col1]);
        }
    }
    printf("\n");
}

int main() {
    char key[30] = "KEYWORD";
    char text[30] = "HELLO";

    createMatrix(key);
    encrypt(text);
    return 0;
}

#include <stdio.h>
#include <string.h>

char matrix[5][5] = {
    {'P','L','A','Y','F'},
    {'I','R','E','X','M'},
    {'B','C','D','G','H'},
    {'K','N','O','Q','S'},
    {'T','U','V','W','Z'}
};

// Function to find the position of a character in the matrix
void find(char ch, int *row, int *col) {
    if (ch == 'J') ch = 'I';  // Treat 'J' as 'I'
    for (int i = 0; i < 5; i++)
        for (int j = 0; j < 5; j++)
            if (matrix[i][j] == ch) {
                *row = i;
                *col = j;
                return;
            }
}

// Function to decrypt two characters using the Playfair cipher rules
void decrypt(char a, char b) {
    int r1, c1, r2, c2;
    find(a, &r1, &c1);
    find(b, &r2, &c2);

    if (r1 == r2) {
        // Same row, move left
        printf("%c%c", matrix[r1][(c1 + 4) % 5], matrix[r2][(c2 + 4) % 5]);
    } else if (c1 == c2) {
        // Same column, move up
        printf("%c%c", matrix[(r1 + 4) % 5][c1], matrix[(r2 + 4) % 5][c2]);
    } else {
        // Rectangle, swap corners
        printf("%c%c", matrix[r1][c2], matrix[r2][c1]);
    }
}

int main() {
    char ciphertext[] = "EXDXHZ";  // Ciphertext to decrypt

    printf("Decrypting: %s\nDecrypted: ", ciphertext);
    
    // Decrypt each pair of characters in the ciphertext
    for (int i = 0; i < strlen(ciphertext); i += 2) {
        decrypt(ciphertext[i], ciphertext[i + 1]);
    }

    printf("\n");
    return 0;
}

Leave a Comment

Your email address will not be published. Required fields are marked *

error: Content is protected !!
Scroll to Top