To encrypt a message using a substitution cipher one needs the plain text alphabet (original alphabet) and the cipher text alphabet (the coded alphabet) which shall serve as a private key.
The formula for the substitution is:
- Ei represents the i-th character from the encoded string
- Cj represents the j-th character from the cipher text alphabet, where j represents the position of the Ei character in the original alphabet.
In order to implement such algorithm we shall define the following enumeration:
typedef enum { OPERATION_SUCCESS = 1U, OPERATION_FAILED = 0U }OPERATION_STATUS;Below you can see the C implementation for the algorithm:
OPERATION_STATUS SimpleSubstitutionCipher_Code(char* originalAlphabet, char* codedAlphabet, char* originalMessage, char* encodedMessage) { unsigned short alphabetLength = strlen(originalAlphabet); unsigned int messageLength = strlen(originalMessage); unsigned int i = 0U; char* pointer = NULL; unsigned int position = 0U; if( alphabetLength != strlen(codedAlphabet) ) { //The lengths of the alphabets do not match return OPERATION_FAILED; } for(i=0; i<messageLength; i++) { pointer = strchr(originalAlphabet, originalMessage[i]); if(pointer==NULL) { //A character in the message was not found in the //original alphabet return OPERATION_FAILED; } else { position = pointer - originalAlphabet; encodedMessage[i] = codedAlphabet[position]; } } encodedMessage[messageLength] = '\0'; return OPERATION_SUCCESS; }The function receives 4 parameters:
- originalAlphabet - a pointer to a string containing the plain text alphabet (who has all the letters that appear in the originalMessage). All symbols in the originalAlphabet should appear only once.
- codedAlphabet - a pointer to a string containing the cipher text alphabet (who has the same length as the originalAlphabet string). All symbols in the codedAlphabet should appear only once.
- originalMessage - a pointer to a string containing the message who will be encoded
- codedMessage - a pointer to a pre-allocated empty string who will contain the encoded message.
The function returns OPERATIONS_SUCCES if all preconditions have been respected, respectively OPERATON_FAILED if the lengths of the alphabets are different or if the function found a symbol in the original message who has not been defined in the originalAlphabet.
char originalAlphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "; char codedAlphabet[] = "QWERTYUIOPASDFGHJKLZXCVBNM#"; char originalMessage[] = "SUBSTITUTION CIPHER"; char encodedMessage[20]; char decodedMessage[20]; //Encoding SimpleSubstitutionCipher_Code(originalAlphabet,codedAlphabet, originalMessage, encodedMessage); puts(encodedMessage); //Decoding SimpleSubstitutionCipher_Code(codedAlphabet,originalAlphabet, encodedMessage, decodedMessage); puts(decodedMessage);As you probably already observed, the same function is used for both encryption and decryption. This is because the same operations are performed in both cases.
No comments:
Post a Comment
Got a question regarding something in the article? Leave me a comment and I will get back at you as soon as I can!