|
Algorithms_in_C++
1.0.0
Set of algorithms implemented in C++.
|
Implementation of Hill cipher algorithm.
More...
#include <cassert>
#include <cmath>
#include <cstring>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>
#include "../numerical_methods/lu_decomposition.h"
|
| | ciphers |
| | Algorithms for encryption and decryption.
|
| |
Implementation of Hill cipher algorithm.
Program to generate the encryption-decryption key and perform encryption and decryption of ASCII text using the famous block cipher algorithm. This is a powerful encryption algorithm that is relatively easy to implement with a given key. The strength of the algorithm depends on the size of the block encryption matrix key; the bigger the matrix, the stronger the encryption and more difficult to break it. However, the important requirement for the matrix is that:
- matrix should be invertible - all inversion conditions should be satisfied and
- its determinant must not have any common factors with the length of character set Due to this restriction, most implementations only implement with small 3x3 encryption keys and a small subset of ASCII alphabets.
In the current implementation, I present to you an implementation for generating larger encryption keys (I have attempted upto 10x10) and an ASCII character set of 97 printable characters. Hence, a typical ASCII text file could be easily encrypted with the module. The larger character set increases the modulo of cipher and hence the matrix determinants can get very large very quickly rendering them ill-defined.
- Note
- This program uses determinant computation using LU decomposition from the file lu_decomposition.h
-
The matrix generation algorithm is very rudimentary and does not guarantee an invertible modulus matrix.
- Todo:
- Better matrix generation algorithm.
- Author
- Krishna Vedala
◆ main()
Main function
537 std::string text =
"This is a simple text with numb3r5 and exclamat!0n.";
◆ operator<<()
operator to print a matrix
56 const char separator =
' ';
58 for (
size_t row = 0; row < v.size(); row++) {
59 for (
size_t col = 0; col < v[row].size(); col++)
◆ test1()
Self test 1 - using 3x3 randomly generated key.
- Parameters
-
| text | string to encrypt and decrypt |
472 std::cout <<
"======Test 1 (3x3 key) ======\nOriginal text:\n\t" << text
491 out_file <<
"Block size: " << ekey.
size() <<
"\n";
492 out_file <<
"Encryption Key:\n" << ekey;
493 out_file <<
"\nDecryption Key:\n" << dkey;
496 assert(txt_back == text);
◆ test2()
Self test 2 - using 8x8 randomly generated key.
- Parameters
-
| text | string to encrypt and decrypt |
507 std::cout <<
"======Test 2 (8x8 key) ======\nOriginal text:\n\t" << text
522 out_file <<
"Block size: " << ekey.
size() <<
"\n";
523 out_file <<
"Encryption Key:\n" << ekey;
524 out_file <<
"\nDecryption Key:\n" << dkey;
527 assert(txt_back.
compare(0, text.
size(), text) == 0);
void mov(tower *From, tower *To)
Definition: tower_of_hanoi.cpp:39
int main()
Definition: knuth_morris_pratt.cpp:76
int main()
Definition: fenwick_tree.cpp:69
void ternary_search(int N, int A[], int target)
Definition: ternary_search.cpp:127
void test3()
Definition: smallest_circle.cpp:188
int main(void)
Definition: decimal_to_hexadecimal.cpp:11
void method2(int number)
Definition: decimal_to_binary.cpp:27
int main()
Definition: exponential_search.cpp:74
ll mat_size
Definition: matrix_exponentiation.cpp:45
int main()
Definition: stairs_pattern.cpp:17
int hash_search(int key, int *counter)
Definition: hash_search.cpp:76
void shell_sort(T *arr, size_t LEN)
Definition: shell_sort2.cpp:45
std::string tolowerRoman(int n)
Definition: decimal_to_roman_numeral.cpp:24
void test_f(const int NUM_DATA)
Definition: shell_sort2.cpp:145
String search algorithms.
Definition: brute_force_string_searching.cpp:13
#define MAX
Definition: fibonacci_fast.cpp:27
void show_data(T *arr, size_t LEN)
Definition: shell_sort2.cpp:18
void heapSort(T *arr, int n)
Definition: heap_sort.cpp:84
int main()
Definition: binomial_dist.cpp:84
double addition_rule_dependent(double A, double B, double B_given_A)
Definition: addition_rule.cpp:25
void test2()
Definition: smallest_circle.cpp:173
double x
Definition: smallest_circle.cpp:16
int main()
Definition: decimal_to_roman_numeral.cpp:90
int sum_range(int l, int r)
Definition: fenwick_tree.cpp:65
void test()
Definition: heap_sort.cpp:99
#define absolutePrecision
Definition: ternary_search.cpp:22
ll ans(ll n)
Definition: matrix_exponentiation.cpp:91
Definition: fenwick_tree.cpp:17
void print(uint32_t N)
Definition: sieve_of_eratosthenes.cpp:40
#define HASHMAX
Determines the length of the hash table.
Definition: hash_search.cpp:22
#define PRIME
Prime modulus for hash functions.
Definition: rabin_karp.cpp:16
int partition(int arr[], int low, int high)
Definition: quick_sort.cpp:37
Type * binary_s(Type *array, size_t size, Type key)
Definition: exponential_search.cpp:34
Definition: avltree.cpp:13
double y
Definition: smallest_circle.cpp:17
int FindNextGap(int gap)
Definition: comb_sort.cpp:29
#define MAX
Determines how much data.
Definition: hash_search.cpp:21
int main()
Definition: pascal_triangle.cpp:52
int main()
Definition: bayes_theorem.cpp:26
vector< vector< ll > > multiply(const vector< vector< ll >> &A, const vector< vector< ll >> &B)
Definition: matrix_exponentiation.cpp:57
void test2(const std::string &text)
Self test 2 - using 8x8 randomly generated key.
Definition: hill_cipher.cpp:505
int main(void)
Definition: qr_decomposition.cpp:23
int main()
Definition: palindrome_of_number.cpp:19
Sorting algorithms.
Definition: non_recursive_merge_sort.cpp:11
int main()
Definition: vector_important_functions.cpp:11
void merge(Iterator, Iterator, const Iterator, char[])
merges 2 sorted adjacent segments into a larger sorted segment
Definition: non_recursive_merge_sort.cpp:57
int main()
Definition: linear_search.cpp:27
static float eqd(float y)
Definition: successive_approximation.cpp:17
std::string fill(char c, int n)
Definition: decimal_to_roman_numeral.cpp:15
void mat_mul(const std::valarray< std::valarray< double >> &A, const std::valarray< std::valarray< double >> &B, std::valarray< std::valarray< double >> *OUT)
Definition: qr_eigen_values.cpp:54
int64_t create_hash(const std::string &s, int n)
Definition: rabin_karp.cpp:25
int stack_idx
pointer to track stack index
Definition: paranthesis_matching.cpp:23
int main(int argc, char *argv[])
Definition: shell_sort2.cpp:183
int main()
Definition: interpolation_search2.cpp:32
int compare(const void *a, const void *b)
Definition: shell_sort2.cpp:87
int brute_force(const std::string &text, const std::string &pattern)
Definition: brute_force_string_searching.cpp:21
int main()
Definition: buzz_number.cpp:9
Functions to compute QR decomposition of any rectangular matrix.
int offset(int x)
Definition: fenwick_tree.cpp:22
void create_matrix(std::valarray< std::valarray< double >> *A)
Definition: qr_eigen_values.cpp:28
int main()
Definition: happy_number.cpp:29
int main()
Definition: text_search.cpp:15
void show(int *arr, int size)
Definition: merge_sort.cpp:96
const std::vector< std::vector< std::string > > test_set
Definition: brute_force_string_searching.cpp:41
int rec_ternary_search(int left, int right, int A[], int target)
Definition: ternary_search.cpp:90
Definition: linkedlist_implentation_usingarray.cpp:14
int y
Point respect to x coordinate.
Definition: line_segment_intersection.cpp:14
std::valarray< double > eigen_values(std::valarray< std::valarray< double >> *A, bool print_intermediates=false)
Definition: qr_eigen_values.cpp:98
int64_t recalculate_hash(const std::string &s, int old_index, int new_index, int64_t old_hash, int patLength)
Definition: rabin_karp.cpp:42
static const char * STRKEY
Definition: hill_cipher.cpp:73
int main()
Definition: smallest_circle.cpp:198
void test_int(const int NUM_DATA)
Definition: shell_sort2.cpp:105
int ** pascal_triangle(int **arr, int n)
Definition: pascal_triangle.cpp:36
int main()
Definition: hill_cipher.cpp:532
void CombSort(int *arr, int l, int r)
Definition: comb_sort.cpp:42
node * insert(node *root, int item)
Definition: avltree.cpp:66
FenwickTree(const std::vector< int > &arr)
Definition: fenwick_tree.cpp:28
void mergeSort(int *arr, int l, int r)
Definition: merge_sort.cpp:83
int main()
Definition: matrix_exponentiation.cpp:126
Library functions to compute QR decomposition of a given matrix.
void merge(int *arr, int l, int m, int r)
Definition: merge_sort.cpp:33
int h(int key)
Definition: hash_search.cpp:45
void non_recursive_merge_sort(const Iterator first, const Iterator last)
bottom-up merge sort which sorts elements in a non-decreasing order
Definition: non_recursive_merge_sort.cpp:86
void update(int id, int val)
Definition: fenwick_tree.cpp:45
int main(int argc, char const *argv[])
Definition: binary_search.cpp:31
Definition: tower_of_hanoi.cpp:11
#define _target
Definition: ternary_search.cpp:27
int binary_search(int a[], int r, int key)
Definition: binary_search.cpp:15
char opening(char ch)
Definition: paranthesis_matching.cpp:36
bool is_happy(T n)
Definition: happy_number.cpp:14
bool check_if_equal(const std::string &str1, const std::string &str2, int start1, int end1, int start2, int end2)
Definition: rabin_karp.cpp:60
int main()
Definition: ternary_search.cpp:134
double binomial_range_successes(double n, double p, double lower_bound, double upper_bound)
Definition: binomial_dist.cpp:74
double LenghtLine(const Point &A, const Point &B)
Definition: smallest_circle.cpp:37
static const std::string encrypt_text(const std::string &text, const matrix< int > &encrypt_key)
Encrypt a given text using a given key.
Definition: hill_cipher.cpp:445
static const std::string decrypt_text(const std::string &text, const matrix< int > &decrypt_key)
Decrypt a given text using a given key.
Definition: hill_cipher.cpp:457
bool kmp(const std::string &pattern, const std::string &text)
Definition: knuth_morris_pratt.cpp:56
double poisson_range_successes(double expected, double lower, double upper)
Definition: poisson_dist.cpp:54
int main()
Definition: tower_of_hanoi.cpp:65
void non_recursive_merge_sort(const Iterator first, const Iterator last, const size_t n)
bottom-up merge sort which sorts elements in a non-decreasing order
Definition: non_recursive_merge_sort.cpp:25
#define ll
Definition: matrix_exponentiation.cpp:33
double binomial_standard_deviation(double n, double p)
Definition: binomial_dist.cpp:36
double TriangleArea(const Point &A, const Point &B, const Point &C)
Definition: smallest_circle.cpp:54
int main()
Definition: brute_force_string_searching.cpp:47
double binomial_x_successes(double n, double p, double x)
Definition: binomial_dist.cpp:65
void test2()
Definition: qr_eigen_values.cpp:210
#define endl
Definition: matrix_exponentiation.cpp:36
struct list * link
pointer to nodes
void spiralPrint(int **a, int r, int c)
Definition: spiral_print.cpp:29
double bayes_BgivenA(double AgivenB, double A, double B)
Definition: bayes_theorem.cpp:20
vector< ll > fib_b
Definition: matrix_exponentiation.cpp:50
double poisson_rate(double events, double timeframe)
Definition: poisson_dist.cpp:17
int key
key value for node
Definition: hash_search.cpp:30
int main(int argc, char **argv)
Definition: qr_eigen_values.cpp:243
double circle(const std::vector< Point > &P)
Definition: smallest_circle.cpp:87
static float eq(float y)
Definition: successive_approximation.cpp:12
Type * struzik_search(Type *array, size_t size, Type key)
Definition: exponential_search.cpp:59
int main()
Definition: poisson_dist.cpp:65
double binomial_expected(double n, double p)
Definition: binomial_dist.cpp:22
int main()
Definition: heap_sort.cpp:120
node hashtab[HASHMAX]
array of nodes
Definition: hash_search.cpp:35
int it_ternary_search(int left, int right, int A[], int target)
Definition: ternary_search.cpp:48
void test1(const std::string &text)
Self test 1 - using 3x3 randomly generated key.
Definition: hill_cipher.cpp:470
static std::pair< matrix< int >, matrix< int > > generate_keys(size_t size, int limit1=0, int limit2=10)
Generate encryption and decryption key pair.
Definition: hill_cipher.cpp:424
int jumpSearch(int arr[], int x, int n)
Definition: jump_search.cpp:12
int data[MAX]
test data
Definition: hash_search.cpp:24
void method1(int number)
Definition: decimal_to_binary.cpp:11
void test1()
Definition: qr_eigen_values.cpp:177
void printArray(T *arr, int sz)
Definition: heap_sort.cpp:37
int main()
Definition: hash_search.cpp:99
void create_list(int key)
Definition: hash_search.cpp:55
double fact(double x)
Definition: poisson_dist.cpp:30
double addition_rule_independent(double A, double B)
Definition: addition_rule.cpp:14
void show(const struct tower *const F, const struct tower *const T, const struct tower *const U)
Definition: tower_of_hanoi.cpp:19
int main()
Definition: sparse_matrix.cpp:9
void test()
Definition: smallest_circle.cpp:158
Definition: huffman.cpp:28
int main()
Definition: spiral_print.cpp:69
#define MAX
Definition: paranthesis_matching.cpp:16
vector< vector< ll > > power(const vector< vector< ll >> &A, ll p)
Definition: matrix_exponentiation.cpp:76
int main()
Definition: successive_approximation.cpp:20
int LinearSearch(int *array, int size, int key)
Definition: linear_search.cpp:16
bool IsPrime(int number)
Definition: primality_test.cpp:18
double nCr(double n, double r)
Definition: binomial_dist.cpp:47
int values[10]
Values in the tower.
Definition: tower_of_hanoi.cpp:13
void qr_decompose(const std::valarray< std::valarray< T >> &A, std::valarray< std::valarray< T >> *Q, std::valarray< std::valarray< T >> *R)
Definition: qr_decompose.h:146
void genArray(int **a, int r, int c)
Definition: spiral_print.cpp:12
int main()
Definition: comb_sort.cpp:88
int main()
Definition: interpolation_search.cpp:37
std::string add(std::string a, std::string b)
Definition: string_fibonacci.cpp:24
int main()
Definition: addition_rule.cpp:30
std::string toupperRoman(int n)
Definition: decimal_to_roman_numeral.cpp:58
#define LIMS
Definition: qr_eigen_values.cpp:20
double bayes_AgivenB(double BgivenA, double A, double B)
Definition: bayes_theorem.cpp:14
int sum(int id)
Definition: fenwick_tree.cpp:54
int main()
Definition: quick_sort.cpp:82
FenwickTree(int x)
Definition: fenwick_tree.cpp:39
Point(double a=0.f, double b=0.f)
Definition: smallest_circle.cpp:23
int main()
Definition: primality_test.cpp:31
struct list * next
pointer to next link in the chain
Definition: hash_search.cpp:31
int top
top tower ID
Definition: tower_of_hanoi.cpp:15
Definition: line_segment_intersection.cpp:12
void TH(int n, tower *From, tower *Using, tower *To)
Definition: tower_of_hanoi.cpp:52
int interpolation_search(int arr[], int value, int len)
Definition: interpolation_search.cpp:15
void push(char ch)
push byte to stack variable
Definition: paranthesis_matching.cpp:26
int main()
Definition: merge_sort.cpp:102
char pop()
pop a byte out of stack variable
Definition: paranthesis_matching.cpp:29
int InterpolationSearch(int A[], int n, int x)
Definition: interpolation_search2.cpp:15
double poisson_expected(double rate, double time)
Definition: poisson_dist.cpp:25
double poisson_x_successes(double expected, double x)
Definition: poisson_dist.cpp:46
int main(void)
Definition: rabin_karp.cpp:105
void quickSort(int arr[], int low, int high)
Definition: quick_sort.cpp:63
std::vector< int > getFailureArray(const std::string &pattern)
Definition: knuth_morris_pratt.cpp:33
void show_pascal(int **arr, int n)
Definition: pascal_triangle.cpp:18
int rabin_karp(const std::string &str, const std::string &pat)
Definition: rabin_karp.cpp:83
void get_input()
Definition: ternary_search.cpp:36
bool PointInCircle(const std::vector< Point > &P, const Point &Center, double R)
Definition: smallest_circle.cpp:72
void tests()
Definition: comb_sort.cpp:73
Definition: list_array.cpp:8
double binomial_variance(double n, double p)
Definition: binomial_dist.cpp:29
void shell_sort(std::vector< T > *arr)
Definition: shell_sort2.cpp:75