def elier_func(p, q): '''Вычислеяет функцию Эйлера''' return p*q - p - q + 1 def secret_exp(e, qn): # qn - результат функции Ейлера '''Вычисляет секретную экспоненту''' print(e, qn) return pow(e,-1) % qn def enc(p, q, e, text): '''Шифррует строку переданную в праметре text''' n = p * q eiler_func_res = elier_func(p ,q) #q(n) #print('{ {0}, {1} }'.format(elier_func, n)) res = [] if text.isalpha(): for i in text: if i.isalpha(): symb_to_enc = ord(i) else: symb_to_enc = i print('{} ** {} % {}'.format(symb_to_enc, e, n)) c = (int(symb_to_enc) ** e) % n res.append(c) elif text.isdigit(): res = (pow(int(text), e)) % n return res def descr(p, q, e, text): '''Расшифровывает строку переданную в праметре text''' n = p * q sec_exp = secret_exp(e, elier_func(p, q)) # d print(sec_exp) res = [] if type(text) == type([]): for i in text: symb_to_desc = (int(i) ** int(sec_exp)) % n print('{} ** {} % {} = {}'.format(i, int(sec_exp), n, symb_to_desc)) res.append(symb_to_desc) else: res = (pow(int(text), e)) % n print('{} ** {} % {}'.format(text, sec_exp, n)) return res def main(): p = input('Enter first open key >>> ') q = input('Enter second open key >>> ') e = input('Enter exponent >>> ') text_to_enc = input('Enter any text to encrypt >>> ') # m try: p, q, e = int(p), int(q), int(e) except ValueError: pass encrypted_text = enc(p, q, e, text_to_enc) desctypted_text = descr(p , q, e, encrypted_text) return(encrypted_text, desctypted_text) print(main())
Беру пример из wiki
Шифрует верно, расшифровать не может. Как я понял: опертор % возвращает значение делимого. Т.е. вычисление секретной экспоненты происходит в функции secret_exp, получается при значениее експоненты 3, должно быть следующее выражение 0.33333333 % 9167368 - возвращает 0.33333333.
Что я делаю не так?
Up
Нашел способ при котором что-то меняется - использовать функцию Decimal из модуля decimal.
Но все равно результат неверный. Сейчас при тех же значениях значение секретной экспоненты равно 0.3333333333333333148296162562