0

Привет мне было интересно, если кто-то может помочь мне со следующей процедурой с использованием MapleRSA процедуры криптология

протоколом метода/шифрования RSA дешифрования ниже и вопросом я пытаюсь попытаться после этого с моей попыткой ниже он, я буду признателен за любую помощь. Благодаря

enter image description here

моя текущая попытка следующая

rsa := proc (key::rsakey, msg::(list(rsascii))) 
local ct, pe, pm, i; 
pm := 26271227347; 
pe := key[2]; 
ct := []; 
for i to nops(msg) do ct := [op(ct), `mod`(message[i]^pe, pm)] 
end do; 
RETURN(ct) 
end proc; 

это с помощью веб-сайта кленовый

+0

и ...? Есть проблема? –

+0

Да, но он работает, но когда я пытаюсь оценить с открытым ключом и немного текста шифрования, который находится в ASCII, он ничего не возвращает – Gibberish

+0

Открытый ключ, этот маленький разрешает только ASCII-сообщения из 3-х символов. –

ответ

1

вы получили 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" 
+0

Если вы используете режим ввода 2D Math (typeset), убедитесь, что между 'rsa' и открывающей скобкой нет дополнительного пространства ('когда вы называете его как' rsa (...) '. С дополнительным пространством он будет анализироваться как умножение. – acer

+0

hi я полностью забыл о необходимости вычисления d, спасибо за это и за дешифрование сообщений на один символ за раз, что займет слишком много времени, поэтому я использовал вместо этого block1: = rsa ([n, d ], [первое число для дешифрования, второго, третьего и т. д.]); Не могли бы вы объяснить мне, что ct: = map (proc (u) options operator, стрелка; 'mod' (' &^'(u, pe), pm) end proc, msg) делает свое тихое запугивание haha ​​ – Gibberish

+0

Попытайтесь выяснить, правильный ли кандидат 'd'. Вы не предоставили значительную часть закодированного сообщения, поэтому вам нужно сообщить нам, как это происходит ... – acer