/* * Filename: crypt.c * Authors(s): Roland (r.weirhowell@gmail.com) * Description: Perform caesar cipher cryptographic operations * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "crypt.h" #include #include /* * For built in C mod operator (%) -1 % 26 == -1 * For the requirements of this algorithm -1 mod 26 == 25 is required * The below functions accomplish this */ // Which of the two below functions is faster (find out!) inline int mod(int a, int b) { return (a % b + b) % b; } inline int fast_mod(int a, int b) { const int result = a % b; return result >= 0 ? result : result + b; } /* * 65 - 90 = ASCII 'A' - 'Z' * 97 - 122 = ASCII 'a' - 'z' */ inline bool isupper(char c) { return c >= 'A' && c <= 'Z'; } void caesar_encrypt(char* str, int64_t size, int key) { for (int64_t i = 0; i < size && str[i] != '\n'; i++) if (str[i] != ' ') { bool upper = isupper(str[i]); str[i] += (char)key - (upper ? 65 : 97); str[i] %= 26; str[i] += (upper ? 65 : 97); } } void caesar_decrypt(char* str, int64_t size, int key) { for (int64_t i = 0; i < size && str[i] != '\n'; i++) if (str[i] != ' ') { bool upper = isupper(str[i]); str[i] = str[i] - (char)key - (upper ? 65 : 97); str[i] = (char)mod(str[i], 26); str[i] += (upper ? 65 : 97); } }