Cifra de César [RESOLVIDO]

1. Cifra de César [RESOLVIDO]

Dilan Severino de Oliveira
dilan1998

(usa Debian)

Enviado em 08/05/2023 - 11:05h

Opa bom dia amigos.

Fiz um script com intuito puramente acadêmico para criar uma cifra sobre uma palavra e descrifrar logo após, fiz com muita gambiarra e gostaria de saber se poderia abusar de algumas outras lógicas para realizar tarefas como essa. vou deixar o script de exemplo

ad_wc=$1
phrase_to_encript_decript_caesar=$(echo $2 | tr [A-Z] [a-z])
phrase=$3
foo() {
input=$(

echo {a..z} |\
sed 's/\s//g' | sed -r "s/^([a-z]){${ad_wc}}/\1/g" |\
grep -Eo "^."

)

if [[ "${phrase}" == "-d" ]] && [[ "${ad_wc}" =~ [0-9]+ ]] && [[ "${phrase_to_encript_decript_caesar}" =~ ^(\s?|[a-zA-Z])+$ ]]

then

dencrypt=$({
paste -d"=" <(eval echo {a..z} | sed -r "s/(.*${input}\s?)(.*)/\2 \1/g" | sed 's/\s/\n/g') <(echo {a..z} | sed -r 's/\s/\n/g')
})
else

dencrypt=$({
paste -d"=" <(echo {a..z} | sed -r 's/\s/\n/g') <(eval echo {a..z} | sed -r "s/(.*${input}\s?)(.*)/\2 \1/g" | sed 's/\s/\n/g')
})
fi

{
eval "$(sed -r 's/^=//g' <<<${dencrypt} | sed '/^$/d')"

eval echo "$(sed -r 's/(.)/$\1/g' <<<${phrase_to_encript_decript_caesar})"

}

}

foo


  


2. Quebrado

Dilan Severino de Oliveira
dilan1998

(usa Debian)

Enviado em 08/05/2023 - 12:03h


Parece haver algo com "T" e "U", mas é alguma ordem ai, vai ser ajustado.


3. Re: Cifra de César

aguamole
aguamole

(usa KUbuntu)

Enviado em 08/05/2023 - 15:03h

Uai, não tem comentário no código?

ad_wc=$1 # recebe o primeiro argumento, que representa o deslocamento da cifra de César
phrase_to_encrypt_decrypt_caesar=$(echo $2 | tr [A-Z] [a-z]) # recebe a frase a ser cifrada/decifrada e converte as letras maiúsculas em minúsculas
phrase=$3 # recebe o terceiro argumento, que representa se a frase será cifrada ou decifrada

function caesar_cipher() { # define a função caesar_cipher
input=$(echo {a..z} | sed 's/\s//g' | sed -r "s/^([a-z]){${ad_wc}}/\1/g" | grep -Eo "^.") # define o conjunto de letras que serão utilizadas para cifrar/decifrar a frase, baseado no deslocamento definido pelo usuário

if [[ "${phrase}" == "-d" ]] && [[ "${ad_wc}" =~ [0-9]+ ]] && [[ "${phrase_to_encrypt_decrypt_caesar}" =~ ^(\s?|[a-zA-Z])+$ ]]
# verifica se a opção escolhida foi "-d" (decifrar), se o deslocamento é um número e se a frase a ser decifrada é composta somente por letras e/ou espaços
then
dencrypt=$(paste -d"=" <(eval echo {a..z} | sed -r "s/(.*${input}\s?)(.*)/\2 \1/g" | sed 's/\s/\n/g') <(echo {a..z} | sed -r 's/\s/\n/g')) # define a tabela de cifragem para decifrar a frase
else
dencrypt=$(paste -d"=" <(echo {a..z} | sed -r 's/\s/\n/g') <(eval echo {a..z} | sed -r "s/(.*${input}\s?)(.*)/\2 \1/g" | sed 's/\s/\n/g')) # define a tabela de cifragem para cifrar a frase
fi

eval "$(sed -r 's/^=//g' <<<${dencrypt} | sed '/^$/d')" # executa a tabela de cifragem definida
eval echo "$(sed -r 's/(.)/$\1/g' <<<${phrase_to_encrypt_decrypt_caesar})" # aplica a cifragem na frase recebida como entrada
}

caesar_cipher # chama a função caesar_cipher para executar o código definido acima



4. Re: Cifra de César [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 08/05/2023 - 15:19h


dilan1998 escreveu:

Opa bom dia amigos.

Fiz um script com intuito puramente acadêmico para criar uma cifra sobre uma palavra e descrifrar logo após, fiz com muita gambiarra e gostaria de saber se poderia abusar de algumas outras lógicas para realizar tarefas como essa. vou deixar o script de exemplo

ad_wc=$1
phrase_to_encript_decript_caesar=$(echo $2 | tr [A-Z] [a-z])
phrase=$3
foo() {
input=$(

echo {a..z} |\
sed 's/\s//g' | sed -r "s/^([a-z]){${ad_wc}}/\1/g" |\
grep -Eo "^."

)

if [[ "${phrase}" == "-d" ]] && [[ "${ad_wc}" =~ [0-9]+ ]] && [[ "${phrase_to_encript_decript_caesar}" =~ ^(\s?|[a-zA-Z])+$ ]]

then

dencrypt=$({
paste -d"=" <(eval echo {a..z} | sed -r "s/(.*${input}\s?)(.*)/\2 \1/g" | sed 's/\s/\n/g') <(echo {a..z} | sed -r 's/\s/\n/g')
})
else

dencrypt=$({
paste -d"=" <(echo {a..z} | sed -r 's/\s/\n/g') <(eval echo {a..z} | sed -r "s/(.*${input}\s?)(.*)/\2 \1/g" | sed 's/\s/\n/g')
})
fi

{
eval "$(sed -r 's/^=//g' <<<${dencrypt} | sed '/^$/d')"

eval echo "$(sed -r 's/(.)/$\1/g' <<<${phrase_to_encript_decript_caesar})"

}

}

foo


Boa tarde Dilan.
Como você chama o script, quais os argumentos, $1, $2 e $3?

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



5. Re: Cifra de César [RESOLVIDO]

Alberto Federman Neto.
albfneto

(usa openSUSE)

Enviado em 08/05/2023 - 17:24h

comentar o código é bom. facilita para quem for modificá-lo.


¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
Albfneto,
Ribeirão Preto, S.P., Brasil.
Usuário Linux, Linux Counter: #479903.
Distros Favoritas: Sabayon, Gentoo, openSUSE, Mageia e OpenMandriva.


6. Nota

Dilan Severino de Oliveira
dilan1998

(usa Debian)

Enviado em 08/05/2023 - 18:01h


Opa pessoal, muito obrigado pelo feedback sobre comentários, realmente solicitar uma visão quando o código não esta comentado é complicado.
Marcelo Oliver, sim recebo argumentos via $1,$2 e $3, aprendi inclusive fazendo este código que é um problema utilizar $1 dentro da função, acabei corrigindo, e modifiquei o código.

Aos demais agradeço ao irmão pelos comentários, hoje vou me desafiar a aplicar o código a um texto contendo caracteres especiais inclusive como pontuações e espaços, tendo uma visão clara do que é pra ser feito vou realizar comentários sobre cada trecho do script importante e vou atualizar ele por aqui. Não utilizei o chatgpt para nada tentar deixar o código mais performatico, hoje a noite vou procurar entender mais sobre expansões de parâmetros para incluir um loop de força bruta, melhorias de desempenho e aplicação em texto(não somente palavras).



7. Nota

Dilan Severino de Oliveira
dilan1998

(usa Debian)

Enviado em 08/05/2023 - 18:06h


albfneto escreveu:

comentar o código é bom. facilita para quem for modificá-lo.


¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
Albfneto,
Ribeirão Preto, S.P., Brasil.
Usuário Linux, Linux Counter: #479903.
Distros Favoritas: Sabayon, Gentoo, openSUSE, Mageia e OpenMandriva.



Opa pessoal, muito obrigado pelo feedback sobre comentários, realmente solicitar uma visão quando o código não esta comentado é complicado.
Marcelo Oliver, sim recebo argumentos via $1,$2 e $3, aprendi inclusive fazendo este código que é um problema utilizar $1 dentro da função, acabei corrigindo, e modifiquei o código.

Aos demais agradeço ao irmão pelos comentários, hoje vou me desafiar a aplicar o código a um texto contendo caracteres especiais inclusive como pontuações e espaços, tendo uma visão clara do que é pra ser feito vou realizar comentários sobre cada trecho do script importante e vou atualizar ele por aqui. Não utilizei o chatgpt para nada tentar deixar o código mais performatico, hoje a noite vou procurar entender mais sobre expansões de parâmetros para incluir um loop de força bruta, melhorias de desempenho e aplicação em texto(não somente palavras).

$1 preciso até me entender melhor esta lógica, vou reformular mas basicamente fica

a b c
a b c

se $1=1
então
b c a
a b c

e assim por diante.

$2 = palavra a ser cifrada, e opcional a flag -d quando se cifra a mensagem pode passar a mensagem para decriptação algo como

bash foo -5 $(bash foo 5 dilan) -d



8. Re: Cifra de César

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/05/2023 - 00:36h

#!/bin/bash

# Sintaxe: caesar [-d] [offset] [arq ...]
# -d Reverter criptografia, em lugar de criptografar
# offset Deslocamento (default: 5)
# arq ... Lista de arquivos cujo conteúdo será tratado (default: /dev/stdin)

offset=5
dec=0

if (( $# > 0 )) && [[ "$1" = "-d" ]]; then
dec=1
shift
fi
if (( $# > 0 )) && [[ "$1" =~ ^-?[0-9]+$ ]]; then
(( ((offset=$1%26)<0) && (offset+=26) ))
shift
fi
(( $# <= 0 )) && set /dev/stdin

(( dec )) && (( offset=26-offset ))

upper="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
lower="abcdefghijklmnopqrstuvwxyz"

src="$upper$lower"
dst="${upper:$offset}${upper:0:$offset}${lower:$offset}${lower:0:$offset}"

while (( $# > 0 )); do
tr "[$src]" "[$dst]" < "$1"
shift
done



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


9. Re: Cifra de César

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 09/05/2023 - 00:37h

Dilan, para enviar os argumentos para a função, é só chamar a função com os argumentos:

pega_args(){
c=0;
echo -e "args recebidos pela linha de comando:
Todos: $@
Qtdd: $#
Um a Um:"
for arg; do echo "$c --> '$arg'";let c++;done
}

pega_args $@

executando:
args.sh {A..F}
Saída:

args recebidos pela linha de comando:
Todos: A B C D E F
Qtdd: 6
Um a Um:
0 --> 'A'
1 --> 'B'
2 --> 'C'
3 --> 'D'
4 --> 'E'
5 --> 'F'


O script:

#!/usr/bin/env bash

#$1=deslocamento
#$2 = c|d
#$3 frase
(("$#"==3)) || exit


proi='àáâãéêíóôõúç';
perm='aaaaeeiooouc';

mltr=({A..Z} {a..z});
sz=${#mltr[@]};
lt1=$(printf '%s%s' {A..Z} {a..z});
lt2=$(for ((n=0;n<${sz};n++)) { printf "${mltr[$(( (n+$1)%${sz} ))]}";})

frase=$(sed "y/$proi/$perm/" <<< "${3}")
sep=$(printf "%*s" "${#frase}"|sed 'y/ /-/');

echo "$sep";
case $2 in
C|c) sed "y/$lt1/$lt2/" <<< "${frase}";;
D|d) sed "y/$lt2/$lt1/" <<< "${frase}";;
esac
echo "$sep";

./cifra.sh 12 c 'Viva o Linux - A maior comunidade GNU/Linux da América Latina!'
--------------------------------------------------------------
huHm A XuzGJ - M ymuAD oAyGzupmpq SZg/XuzGJ pm MyqDuom XmFuzm!
--------------------------------------------------------------
./cifra.sh 12 d 'huHm A XuzGJ - M ymuAD oAyGzupmpq SZg/XuzGJ pm MyqDuom XmFuzm!'
--------------------------------------------------------------
Viva o Linux - A maior comunidade GNU/Linux da America Latina!
--------------------------------------------------------------

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________



10. Nota

Dilan Severino de Oliveira
dilan1998

(usa Debian)

Enviado em 09/05/2023 - 18:38h

Dahora, eu vou refazer utilizando conhecimentos mais especificos sobre programação em shell, vamos fazer o seguinte eu vou ajustar esse como desafio postar aqui.
Estou numa jornada de criptgrafia, e pretendo fazer toda e qualquer possibilidade de encriptação e decriptação, mas quero fazer na mão, vamos ver aonde vai...


11. Nota

Dilan Severino de Oliveira
dilan1998

(usa Debian)

Enviado em 09/05/2023 - 18:50h

Me senti burro e criativo por conseguir com as armas que tinha kkkkkkk...


12. Nota

Dilan Severino de Oliveira
dilan1998

(usa Debian)

Enviado em 10/05/2023 - 00:23h


Estou tentando fazer com expansões de variáveis, já estou aprendendo sobre o assunto, inclusive estou perdendo em questão de performance somente para definir a=b em caso de 1 deslocamento, segue o teste com os script de Oliver e Paulo, e o meu script no momento somente definindo o alfabeto invertido;

Script atual :
#

x=$({
str=$(echo {a..z})
echo ${str// /}
}) #Define a variável "abc..." sem espacos

var=$(echo ${x:$1:26}${x:0:$1}) # $var recebe $x com cortando o número de desolcamentos da esquerda para direita e imprimindo $x cortando da direita para esquerda formando um novo alfabeto deslocado

var2=$(for (( i=1; i<${#var}; i++ )); do

echo "${var:$i:1}=${x:$i:1}" # atribui a cada interação do loop o valor do alfabeto deslocado ao alfabeto original

done
)
for caraia in ${var2}; do

rsux="${caraia%=*}" #retira o sufixo da variável através de expansões
rfix="${caraia#*=}" # retira o prefixo
eval "$rsux=$rfix" # define a=b em caso de um deslocamento e assim por diante

done

echo $a # teste

#

Scripts de Oliver, Paulo e Dilan

[root@ZABBIX-4 ekos.dir]# i=0 ; time for ((i;i<100;i++)) ; { bash oliver.sh 1 c 'Viva o Linux - A maior comunidade GNU/Linux da América Latina!' >-; }

real 0m2.457s
user 0m0.348s
sys 0m1.191s
[root@ZABBIX-4 ekos.dir]# i=0 ; time for ((i;i<100;i++)) ; { bash paulo.sh 1 file >- ; }

real 0m0.896s
user 0m0.124s
sys 0m0.381s
[root@ZABBIX-4 ekos.dir]# i=0 ; time for ((i;i<100;i++)) ; { bash decript_if_echo.sh 1 >-; }

real 0m1.112s
user 0m0.110s
sys 0m0.563s
[root@ZABBIX-4 ekos.dir]#




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts