Orbiter 2022
Combinatorial Objects
cryptography.h
Go to the documentation of this file.
1/*
2 * cryptography.h
3 *
4 * Created on: Nov 4, 2020
5 * Author: betten
6 */
7
8#ifndef SRC_LIB_FOUNDATIONS_CRYPTOGRAPHY_CRYPTOGRAPHY_H_
9#define SRC_LIB_FOUNDATIONS_CRYPTOGRAPHY_CRYPTOGRAPHY_H_
10
11
12
13namespace orbiter {
14namespace layer1_foundations {
15namespace cryptography {
16
17
18
19// #############################################################################
20// cryptography_domain.cpp
21// #############################################################################
22
24
26
27public:
28
31 void affine_cipher(std::string &ptext, std::string &ctext, int a, int b);
32 void affine_decipher(std::string &ctext, std::string &ptext, std::string &guess);
33 void vigenere_cipher(std::string &ptext, std::string &ctext, std::string &key);
34 void vigenere_decipher(std::string &ctext, std::string &ptext, std::string &key);
35 void vigenere_analysis(std::string &ctext);
36 void vigenere_analysis2(std::string &ctext, int key_length);
37 int kasiski_test(std::string &ctext, int threshold);
38 void print_candidates(std::string &ctext,
39 int i, int h, int nb_candidates, int *candidates);
40 void print_set(int l, int *s);
41 void print_on_top(std::string &text1, std::string &text2);
42 void decipher(std::string &ctext, std::string &ptext, std::string &guess);
43 void analyze(std::string &text);
44 double friedman_index(int *mult, int n);
45 double friedman_index_shifted(int *mult, int n, int shift);
46 void print_frequencies(int *mult);
47 void single_frequencies(std::string &text, int *mult);
48 void single_frequencies2(std::string &text, int stride, int n, int *mult);
49 void double_frequencies(std::string &text, int *mult);
50 void substition_cipher(std::string &ptext, std::string &ctext, std::string &key);
51 char lower_case(char c);
52 char upper_case(char c);
53 char is_alnum(char c);
54 void get_random_permutation(std::string &p);
55
56 void make_affine_sequence(int a, int c, int m, int verbose_level);
57 void make_2D_plot(int *orbit, int orbit_len, int cnt,
58 int m, int a, int c, int verbose_level);
59 void do_random_last(int random_nb, int verbose_level);
60 void do_random(int random_nb, std::string &fname_csv, int verbose_level);
61
63 int EC_b, int EC_c, int EC_s,
64 std::string &pt_text, std::string &EC_message,
65 int verbose_level);
66 void do_EC_points(field_theory::finite_field *F, std::string &label,
67 int EC_b, int EC_c, int verbose_level);
68 int EC_evaluate_RHS(field_theory::finite_field *F, int EC_b, int EC_c, int x);
69 // evaluates x^3 + bx + c
70 void do_EC_add(field_theory::finite_field *F, int EC_b, int EC_c,
71 std::string &pt1_text, std::string &pt2_text, int verbose_level);
72 void do_EC_cyclic_subgroup(field_theory::finite_field *F, int EC_b, int EC_c,
73 std::string &pt_text, int verbose_level);
74 void do_EC_multiple_of(field_theory::finite_field *F, int EC_b, int EC_c,
75 std::string &pt_text, int n, int verbose_level);
76 void do_EC_discrete_log(field_theory::finite_field *F, int EC_b, int EC_c,
77 std::string &base_pt_text, std::string &pt_text, int verbose_level);
79 std::string &EC_bsgs_G, int EC_bsgs_N,
80 std::string &EC_bsgs_cipher_text,
81 int verbose_level);
83 std::string &EC_bsgs_A, int EC_bsgs_N,
84 std::string &EC_bsgs_cipher_text_T, std::string &EC_bsgs_keys,
85 int verbose_level);
86 void do_RSA_encrypt_text(long int RSA_d, long int RSA_m,
87 int RSA_block_size, std::string &RSA_encrypt_text, int verbose_level);
88 void do_RSA(long int RSA_d, long int RSA_m, int RSA_block_size,
89 std::string &RSA_text, int verbose_level);
90
91 void NTRU_encrypt(int N, int p, field_theory::finite_field *Fq,
92 std::string &H_coeffs, std::string &R_coeffs, std::string &Msg_coeffs,
93 int verbose_level);
94 void polynomial_center_lift(std::string &A_coeffs, field_theory::finite_field *F,
95 int verbose_level);
96 void polynomial_reduce_mod_p(std::string &A_coeffs, field_theory::finite_field *F,
97 int verbose_level);
98
99 void do_jacobi(int jacobi_top, int jacobi_bottom, int verbose_level);
100 void do_solovay_strassen(int p, int a, int verbose_level);
101 void do_miller_rabin(int p, int nb_times, int verbose_level);
102 void do_fermat_test(int p, int nb_times, int verbose_level);
103 void do_find_pseudoprime(int nb_digits, int nb_fermat,
104 int nb_miller_rabin, int nb_solovay_strassen, int verbose_level);
105 void do_find_strong_pseudoprime(int nb_digits,
106 int nb_fermat, int nb_miller_rabin, int verbose_level);
107 void do_miller_rabin_text(std::string &number_text,
108 int nb_miller_rabin, int verbose_level);
109 void quadratic_sieve(int n, int factorbase,
110 int x0, int verbose_level);
111 void calc_log2(std::vector<int> &primes,
112 std::vector<int> &primes_log2, int verbose_level);
114 std::string &square_root_a,
115 std::string &square_root_mod_n,
116 std::vector<long int> &S, int verbose_level);
117 void square_root(std::string &square_root_number, int verbose_level);
118 void square_root_mod(std::string &square_root_number,
119 std::string &mod_number, int verbose_level);
120 void reduce_primes(std::vector<int> &primes,
122 int &f_found_small_factor, int &small_factor,
123 int verbose_level);
124 void do_sift_smooth(int sift_smooth_from,
125 int sift_smooth_len,
126 std::string &sift_smooth_factor_base, int verbose_level);
127 void do_discrete_log(long int y, long int a, long int p, int verbose_level);
128 void do_primitive_root(long int p, int verbose_level);
130 void do_smallest_primitive_root(long int p, int verbose_level);
131 void do_smallest_primitive_root_interval(long int p_min, long int p_max, int verbose_level);
132 void do_number_of_primitive_roots_interval(long int p_min, long int p_max, int verbose_level);
133 void do_inverse_mod(long int a, long int n, int verbose_level);
134 void do_extended_gcd(int a, int b, int verbose_level);
137 int verbose_level);
138
139
142 std::vector<int> &primes, std::vector<int> &R1, std::vector<int> &R2,
143 int verbose_level);
144 void Quadratic_Sieve(
145 int factorbase,
146 int f_mod, int mod_n, int mod_r, int x0,
148 std::vector<int> &primes, std::vector<int> &primes_log2,
149 std::vector<int> &R1, std::vector<int> &R2,
150 std::vector<int> &X,
151 int verbose_level);
152 int quadratic_sieve(
154 std::vector<int> &primes, std::vector<int> &primes_log2,
155 std::vector<int> &R1, std::vector<int> &R2,
156 int from, int to,
157 int ll, std::vector<int> &X, int verbose_level);
159 std::vector<int> &primes,
160 std::vector<int> &factor_idx, std::vector<int> &factor_exp,
161 int verbose_level);
164 std::vector<int> &primes, std::vector<int> &exponents,
165 int verbose_level);
166
169 int nb_solovay_strassen_tests, int f_miller_rabin_test,
170 int verbose_level);
172 ring_theory::longinteger_object &n, int nb_tests, int verbose_level);
174 ring_theory::longinteger_object &n, int verbose_level);
175 int fermat_test_iterated_with_latex_key(std::ostream &ost,
176 ring_theory::longinteger_object &P, int nb_times,
177 int verbose_level);
178 int fermat_test_with_latex_key(std::ostream &ost,
180 int verbose_level);
183 int verbose_level);
184 int solovay_strassen_test_with_latex_key(std::ostream &ost,
186 int verbose_level);
188 ring_theory::longinteger_object &P, int nb_times,
189 int verbose_level);
190 // returns TRUE is the test is conclusive, i.e. if the number is not prime.
192 ring_theory::longinteger_object &n, int verbose_level);
193 int miller_rabin_test_with_latex_key(std::ostream &ost,
194 ring_theory::longinteger_object &n, int iteration, int verbose_level);
195 int miller_rabin_test_iterated_with_latex_key(std::ostream &ost,
196 ring_theory::longinteger_object &P, int nb_times,
197 int verbose_level);
198 // returns TRUE is the test is conclusive, i.e. if the number is not prime.
201 int nb_tests_solovay_strassen,
202 int f_miller_rabin_test, int verbose_level);
206 int nb_bits,
207 int nb_tests_solovay_strassen, int f_miller_rabin_test,
208 int verbose_level);
209
210};
211
212}}}
213
214
215
216#endif /* SRC_LIB_FOUNDATIONS_CRYPTOGRAPHY_CRYPTOGRAPHY_H_ */
a collection of functions related to cryptography
Definition: cryptography.h:25
void single_frequencies2(std::string &text, int stride, int n, int *mult)
void do_miller_rabin_text(std::string &number_text, int nb_miller_rabin, int verbose_level)
void print_on_top(std::string &text1, std::string &text2)
void do_jacobi(int jacobi_top, int jacobi_bottom, int verbose_level)
void vigenere_cipher(std::string &ptext, std::string &ctext, std::string &key)
void do_EC_discrete_log(field_theory::finite_field *F, int EC_b, int EC_c, std::string &base_pt_text, std::string &pt_text, int verbose_level)
void do_sift_smooth(int sift_smooth_from, int sift_smooth_len, std::string &sift_smooth_factor_base, int verbose_level)
void do_find_strong_pseudoprime(int nb_digits, int nb_fermat, int nb_miller_rabin, int verbose_level)
void do_EC_Koblitz_encoding(field_theory::finite_field *F, int EC_b, int EC_c, int EC_s, std::string &pt_text, std::string &EC_message, int verbose_level)
int miller_rabin_test(ring_theory::longinteger_object &n, int verbose_level)
void do_discrete_log(long int y, long int a, long int p, int verbose_level)
void do_fermat_test(int p, int nb_times, int verbose_level)
void make_affine_sequence(int a, int c, int m, int verbose_level)
void do_EC_baby_step_giant_step(field_theory::finite_field *F, int EC_b, int EC_c, std::string &EC_bsgs_G, int EC_bsgs_N, std::string &EC_bsgs_cipher_text, int verbose_level)
void all_square_roots_mod_n_by_exhaustive_search_lint(std::string &square_root_a, std::string &square_root_mod_n, std::vector< long int > &S, int verbose_level)
void NTRU_encrypt(int N, int p, field_theory::finite_field *Fq, std::string &H_coeffs, std::string &R_coeffs, std::string &Msg_coeffs, int verbose_level)
void do_RSA(long int RSA_d, long int RSA_m, int RSA_block_size, std::string &RSA_text, int verbose_level)
void decipher(std::string &ctext, std::string &ptext, std::string &guess)
void do_EC_cyclic_subgroup(field_theory::finite_field *F, int EC_b, int EC_c, std::string &pt_text, int verbose_level)
int factor_over_factor_base2(ring_theory::longinteger_object &x, std::vector< int > &primes, std::vector< int > &exponents, int verbose_level)
int solovay_strassen_is_prime_single_test(ring_theory::longinteger_object &n, int verbose_level)
void do_random(int random_nb, std::string &fname_csv, int verbose_level)
void do_power_mod(ring_theory::longinteger_object &a, ring_theory::longinteger_object &k, ring_theory::longinteger_object &n, int verbose_level)
void reduce_primes(std::vector< int > &primes, ring_theory::longinteger_object &M, int &f_found_small_factor, int &small_factor, int verbose_level)
void substition_cipher(std::string &ptext, std::string &ctext, std::string &key)
void RSA_setup(ring_theory::longinteger_object &n, ring_theory::longinteger_object &p, ring_theory::longinteger_object &q, ring_theory::longinteger_object &a, ring_theory::longinteger_object &b, int nb_bits, int nb_tests_solovay_strassen, int f_miller_rabin_test, int verbose_level)
void find_probable_prime_above(ring_theory::longinteger_object &a, int nb_solovay_strassen_tests, int f_miller_rabin_test, int verbose_level)
void Quadratic_Sieve(int factorbase, int f_mod, int mod_n, int mod_r, int x0, int n, ring_theory::longinteger_object &M, ring_theory::longinteger_object &sqrtM, std::vector< int > &primes, std::vector< int > &primes_log2, std::vector< int > &R1, std::vector< int > &R2, std::vector< int > &X, int verbose_level)
void affine_cipher(std::string &ptext, std::string &ctext, int a, int b)
int solovay_strassen_test_iterated_with_latex_key(std::ostream &ost, ring_theory::longinteger_object &P, int nb_times, int verbose_level)
int solovay_strassen_is_prime(ring_theory::longinteger_object &n, int nb_tests, int verbose_level)
void calc_roots(ring_theory::longinteger_object &M, ring_theory::longinteger_object &sqrtM, std::vector< int > &primes, std::vector< int > &R1, std::vector< int > &R2, int verbose_level)
void do_miller_rabin(int p, int nb_times, int verbose_level)
void polynomial_center_lift(std::string &A_coeffs, field_theory::finite_field *F, int verbose_level)
void print_candidates(std::string &ctext, int i, int h, int nb_candidates, int *candidates)
int solovay_strassen_test(ring_theory::longinteger_object &n, ring_theory::longinteger_object &a, int verbose_level)
void do_number_of_primitive_roots_interval(long int p_min, long int p_max, int verbose_level)
void do_inverse_mod(long int a, long int n, int verbose_level)
void calc_log2(std::vector< int > &primes, std::vector< int > &primes_log2, int verbose_level)
void do_RSA_encrypt_text(long int RSA_d, long int RSA_m, int RSA_block_size, std::string &RSA_encrypt_text, int verbose_level)
int fermat_test_with_latex_key(std::ostream &ost, ring_theory::longinteger_object &n, ring_theory::longinteger_object &a, int verbose_level)
void square_root(std::string &square_root_number, int verbose_level)
void affine_decipher(std::string &ctext, std::string &ptext, std::string &guess)
int miller_rabin_test_iterated_with_latex_key(std::ostream &ost, ring_theory::longinteger_object &P, int nb_times, int verbose_level)
void polynomial_reduce_mod_p(std::string &A_coeffs, field_theory::finite_field *F, int verbose_level)
void do_EC_baby_step_giant_step_decode(field_theory::finite_field *F, int EC_b, int EC_c, std::string &EC_bsgs_A, int EC_bsgs_N, std::string &EC_bsgs_cipher_text_T, std::string &EC_bsgs_keys, int verbose_level)
int EC_evaluate_RHS(field_theory::finite_field *F, int EC_b, int EC_c, int x)
void do_EC_points(field_theory::finite_field *F, std::string &label, int EC_b, int EC_c, int verbose_level)
void square_root_mod(std::string &square_root_number, std::string &mod_number, int verbose_level)
int fermat_test_iterated_with_latex_key(std::ostream &ost, ring_theory::longinteger_object &P, int nb_times, int verbose_level)
void vigenere_decipher(std::string &ctext, std::string &ptext, std::string &key)
int miller_rabin_test_with_latex_key(std::ostream &ost, ring_theory::longinteger_object &n, int iteration, int verbose_level)
void make_2D_plot(int *orbit, int orbit_len, int cnt, int m, int a, int c, int verbose_level)
void do_primitive_root_longinteger(ring_theory::longinteger_object &p, int verbose_level)
void do_smallest_primitive_root_interval(long int p_min, long int p_max, int verbose_level)
int factor_over_factor_base(ring_theory::longinteger_object &x, std::vector< int > &primes, std::vector< int > &factor_idx, std::vector< int > &factor_exp, int verbose_level)
void quadratic_sieve(int n, int factorbase, int x0, int verbose_level)
void do_EC_add(field_theory::finite_field *F, int EC_b, int EC_c, std::string &pt1_text, std::string &pt2_text, int verbose_level)
int solovay_strassen_test_with_latex_key(std::ostream &ost, ring_theory::longinteger_object &n, ring_theory::longinteger_object &a, int verbose_level)
void get_k_bit_random_pseudoprime(ring_theory::longinteger_object &n, int k, int nb_tests_solovay_strassen, int f_miller_rabin_test, int verbose_level)
void do_EC_multiple_of(field_theory::finite_field *F, int EC_b, int EC_c, std::string &pt_text, int n, int verbose_level)
void do_find_pseudoprime(int nb_digits, int nb_fermat, int nb_miller_rabin, int nb_solovay_strassen, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
the orbiter library for the classification of combinatorial objects