[PITCH] CryptoHarmony: Criptografia baseada nas escalas musicais
Olá pessoal, recentemente venho estudado python para cyber e crypto, e uma das ideias que tive para aprimorar minhas habilidades foi criar uma criptografia que se baseia nas escalas musicais como:
Escalas
escalas_expandidas = {
"C": [
"C", "C#", "D", "D#", "E", "F", "F#",
"G", "G#", "A", "A#", "B", "C2", "C#2",
"D2", "D#2", "E2", "F2", "F#2", "G2",
"G#2", "A2", "A#2", "B2", "C3", "C#3"
],
"D": [
"D", "D#", "E", "F", "F#", "G", "G#",
"A", "A#", "B", "C", "C#", "D2", "D#2",
"E2", "F2", "F#2", "G2", "G#2", "A2",
"A#2", "B2", "C2", "C#2", "D3", "D#3"
],
"E": [
"E", "F", "F#", "G", "G#", "A", "A#",
"B", "C", "C#", "D", "D#", "E2", "F2",
"F#2", "G2", "G#2", "A2", "A#2", "B2",
"C2", "C#2", "D2", "D#2", "E3", "F3"
],
"F": [
"F", "F#", "G", "G#", "A", "A#", "B",
"C", "C#", "D", "D#", "E", "F2", "F#2",
"G2", "G#2", "A2", "A#2", "B2", "C2",
"C#2", "D2", "D#2", "E2", "F3", "F#3"
],
"G": [
"G", "G#", "A", "A#", "B", "C", "C#",
"D", "D#", "E", "F", "F#", "G2", "G#2",
"A2", "A#2", "B2", "C2", "C#2", "D2",
"D#2", "E2", "F2", "F#2", "G3", "G#3"
],
"A": [
"A", "A#", "B", "C", "C#", "D", "D#",
"E", "F", "F#", "G", "G#", "A2", "A#2",
"B2", "C2", "C#2", "D2", "D#2", "E2",
"F2", "F#2", "G2", "G#2", "A3", "A#3"
],
"B": [
"B", "C", "C#", "D", "D#", "E", "F",
"F#", "G", "G#", "A", "A#", "B2", "C2",
"C#2", "D2", "D#2", "E2", "F2", "F#2",
"G2", "G#2", "A2", "A#2", "B3", "C3"
]
}
Função que gera uma lista de escalas para cada caractere do texto, repetindo a senha tonal
def gerar_chaves_tonal(texto, senha):
## Para cada caractere do texto, associa uma letra da senha (maiuscula)
return [senha[i % len(senha)].upper() for i in range(len(texto))]
Função que criptografa o texto usando a senha tonal
def criptografar(texto, senha_tonal):
texto = texto.lower() # Converte texto para minúsculas para padronizar
chaves_tonal = gerar_chaves_tonal(texto, senha_tonal) # Gera as escalas para cada caractere
resultado = []
Para cada letra do texto junto com sua escala correspondente...
for letra, escala_nome in zip(texto, chaves_tonal):
if letra in alfabeto: # Se for uma letra do alfabeto
escala = escalas_expandidas[escala_nome] ## Pega a escala referente à letra da senha
indice_letra = alfabeto.index(letra) ## Pega o índice da letra no alfabeto (0-25)
nota = escala[indice_letra] ## Mapeia a letra para a nota correspondente na escala
resultado.append(nota) ## Adiciona a nota cifrada ao resultado
else:
## Se não for letra (espaço, pontuação), mantém como está no resultado
resultado.append(letra)
return resultado
Função que descriptografa a lista de notas usando a senha tonal
def descriptografar(notas, senha_tonal):
resultado = []
# Cria lista só com as notas musicais para gerar as escalas corretas
notas_musicais = [n for n in notas if n in sum(escalas_expandidas.values(), [])]
chaves_tonal = gerar_chaves_tonal(notas_musicais, senha_tonal)
idx = 0 ## Índice para iterar nas chaves tonais só das notas
for nota in notas:
if nota in sum(escalas_expandidas.values(), []): # Se for nota musical
escala_nome = chaves_tonal[idx] # Escala da nota atual
escala = escalas_expandidas[escala_nome]
indice_nota = escala.index(nota) # Índice da nota na escala
letra = alfabeto[indice_nota] # Mapeia a nota para letra do alfabeto
resultado.append(letra) # Adiciona letra decifrada ao resultado
idx += 1
else:
## Se não for nota musical (espaço, pontuação), mantém no resultado
resultado.append(nota)
return "".join(resultado) # Junta tudo numa string
Teste interativo
texto_original = input("Texto para criptografar: ")
senha = input("Senha tonal (ex: CDFG): ")
criptografado = criptografar(texto_original, senha)
print("\n Texto criptografado em notas:", " ".join(criptografado))
decifrado = descriptografar(criptografado, senha)
print("\n Texto descriptografado:", decifrado)
Este foi um projetinho básico feito em uma noite, não é uma criptografia avançada mas me ajudou a melhorar, se alguem tiver alguma dica de como melhora-la, ficarei grato!
Obrigado pro ler até aqui
E pra caso não nos vermos mais
Bom dia, Boa tarde e boa noite.