При шифровании текста эльгамалем (классический вариант: мультипликативная группа Zp со звездочкой, (text*a^rand) mod p,...) в результате получаются пары чисел, оба из которых меньше p. Подскажите, как лучше перегнать это в текст, при этом не уменьшать р и получить количество символов криптотекста ровно в 2 раза большее, чем в открытом тексте?
из-за того, что Вы берете модуль то длина криптотекста будет зависть от открытого текста. На счет перегнать в текст, это в каком смысле? Вы можете BASE64 использовать.
Понимаю некоторую нелогичность, с точки зрения практического применения, но мой преподаватель - бабушка лет под 60 и она категорически отказывается воспринимать идею, насчет того, что можно просто брать данные по 2 байта и использовать полученное шестнацатиричное значение. Ей подавай строку, алфваит, перевод строки в последовательность номеров символов алфавита и т.д. Вобщем если я беру модуль 29(латиница+" ",",",".") то это не катит: модуль маленький. Если модуль побольше - то весь диапозон полученных значений я никак не умещу в [0,..,29], так чтобы символов криптотекста было ровно в двое больше чем сиволов открытого. Из такого маразма как-то можно выкрутится?
Так берите большое число, как модуль. И большой блок нужной длины 1024бита например и все. я не понимаю Вашего вопроса видимо.
himik Бабушка между прочим права : берешь латиницу большие и маленькие + цифры + пару символов и получаешь то, что тебе советовали - Base64. Если взять три байта зашифрованного потока и разбить их на группу 4х6 битов, то в результате ЛЮБОЙ текст, а не только 26+3, закодируешь не 1 к 2, а всего 1 к 1.33 И бабушка поставит 5 баллов.
himik Если я правильно понял - вам надо сначала входной текст ужать (если анси - то можно ужать с 8 бит до 6 ; если юникод - то с 16 бит ужимаем до тех же 6 с допущением, что юзаем только русские буквы - большие и маленькие - вроде как раз 64 будет...), потом провести вычисления и полученные числа представить в том же алфавите (32+32 = 64)...
может так? Код (Text): #!/usr/bin/env python def s2n(s): return long(s, 16) def n2s(num): if num < 0: num *= -1 s = '' while 1: s = chr(num % 256) + s num = num // 256 if num == 0: break return s