вы получили n
и e
, и вы должны будете найти соответствующий d
, прежде чем вы сможете декодировать. Я не понимаю, почему вы пытались использовать e
для декодирования.
Ваша процедура содержит хотя бы один тип, используя message[i]
вместо msg[i]
. См. Также комментарии в коде ниже.
После обнаружения d
Я получаю, что кодированное целое число 11393739244 декодирует целое число 87, что соответствует символу ASCII «W» (а не «wha» или «Wha», как вы предложили).
Я не понимаю, что вы собираетесь делать с размером блока, и , поэтому мне пришлось угадать. Ниже я показываю кодирование/декодирование, сделанное либо A) персонажем за раз, либо B), используя сразу три символа. Надеюсь, вы поймете, что кодировка по одному символу - это не отличная идея. Кроме того, в двух экземплярах на другом форуме вы написали, что вам не нужна защита от атак. (Вы также писали там, что это не домашнее задание, но здесь оно больше похоже на IMO.)
Если у вас возникли проблемы с написанием и использованием вашей процедуры rsa
, вы можете найти различные операции разделения/конкатенации/дополнения также.
В комментарии вы написали, что, когда вы попытались использовать свою начальную попытку в процедуре rsa
, тогда «она ничего не возвращает». Если он был возвращен как неоцененный вызов, возможно, ваша попытка создать процесс и присвоить его фактически не работала. Если у вас возникли проблемы с использованием режима 2D-ввода по умолчанию Maple в документе, рассмотрите возможность переключения ваших предпочтений на вход 1D Maple Notation на листе. Это две настройки для стандартного графического интерфейса Java Maple.
NB. Я использую команду Maple numtheory[lambda]
, чтобы найти «наименьшее целое число i такое, что для всех g взаимно простых значений n, g^i конгруэнтно 1 по модулю n". В последних версиях Maple это также доступно как команда NumberThoery:-CarmichaelLambda
. См. Также here.
restart;
# The procedure `rsa` below can be used to both encode or
# decode an integer.
#
# Conversion from/to ASCII is done separately, before/after.
rsa := proc(key::list(posint), msg::list(posint))
local ct, pe, pm, i;
pm := key[1];
pe := key[2];
## The original used `message` instead of `msg`, which was
## a careless typo. But iterated list concatenation like this
## is inefficient. Better to just use `seq`, as below.
## Also, use inert `&^` instead of `^` in the call to `mod`
## since the latter inefficiently computes the power
## explicitly (before taking the modulus).
#ct := [];
# for i to nops(msg) do ct := [op(ct), `mod`(msg[i] &^ pe, pm)]
#end do;
ct := map(u->`mod`(u &^ pe, pm), msg);
return ct;
end proc:
# You supplied (n,e) and you'll need to find d in order to decode.
n:=26271227347;
n := 26271227347
L := numtheory[lambda](n);
L := 13135445468
e:=11546465;
e := 11546465
evalb(e < L); # a requirement
true
evalb(gcd(e, L) = 1); # a requirement
true
d := 1/e mod L;
d := 7567915453
# Now decode the number you supplied.
res := rsa([n,d],[11393739244]);
res := [87]
with(StringTools):
# So what ASCII character is that?
convert(res,bytes);
"W"
s := "Wha":
sb := map(convert,convert(s,bytes),string);
sb := ["87", "104", "97"]
sbn := map(parse,sb);
sbn := [87, 104, 97]
encoded := rsa([n,e],sbn);
encoded := [11393739244, 9911682959, 21087186892]
decoded := rsa([n,d],encoded);
decoded := [87, 104, 97]
pad := proc(str::string)
local r;
r := irem(length(str),3);
cat(seq("0",i=1..`if`(r=0,0,3-r)), str);
end proc:
map(pad, map(convert,decoded,string));
["087", "104", "097"]
cat(op(map(u->convert(map(parse,[LengthSplit(convert(u,string),3)]),
bytes), %)));
"Wha"
newsb := [cat(op(map(SubstituteAll,map(PadLeft,sb,3)," ","0")))];
newsb := ["087104097"]
newsbn := map(parse,newsb);
newsbn := [87104097]
encoded := rsa([n,e],newsbn);
encoded := [15987098394]
decoded := rsa([n,d],%);
decoded := [87104097]
map(pad, map(convert,decoded,string));
["087104097"]
cat(op(map(u->convert(map(parse,[LengthSplit(convert(u,string),3)]),
bytes), %)));
"Wha"
и ...? Есть проблема? –
Да, но он работает, но когда я пытаюсь оценить с открытым ключом и немного текста шифрования, который находится в ASCII, он ничего не возвращает – Gibberish
Открытый ключ, этот маленький разрешает только ASCII-сообщения из 3-х символов. –