def decodificar_UTF8_para_texto(codigo_UTF8): tamanho_codigo_UTF8 = len(codigo_UTF8) if not codigo_UTF8 or tamanho_codigo_UTF8 % 8 != 0: return dicionarios.retorna_erro_mensagem() texto_decodicado = '' i = 0 while i < tamanho_codigo_UTF8: if codigo_UTF8[i:i+5] == '11110': bin_atual = codigo_UTF8[i+5:i+8] + codigo_UTF8[i+10:i+16] + codigo_UTF8[i+18:i+24] + codigo_UTF8[i+26:i+32] i += 32 elif codigo_UTF8[i:i+4] == '1110': bin_atual = codigo_UTF8[i+4:i+8] + codigo_UTF8[i+10:i+16] + codigo_UTF8[i+18:i+24] i += 24 elif codigo_UTF8[i:i+3] == '110': bin_atual = codigo_UTF8[i+3:i+8] + codigo_UTF8[i+10:i+16] i += 16 elif codigo_UTF8[i] == '0': bin_atual = codigo_UTF8[i+1:i+8] i += 8 else: return dicionarios.retorna_erro_mensagem() UNICODE_novo_caractere = bases_numericas.converter_binario_para_decimal(bin_atual, tirar_zeros_esq=False) if not UNICODE_novo_caractere: return dicionarios.retorna_erro_mensagem() texto_decodicado += chr(bases_numericas.converter_binario_para_decimal(bin_atual, tirar_zeros_esq=False)) return texto_decodicado
def retornar_texto_traduzido(mensagem, funcao_tradutora): if not mensagem: return dicionarios.retorna_erro_mensagem() mensagem_traduzida = '' for numero in mensagem.split(): valor_UNICODE = funcao_tradutora(numero) if not valor_UNICODE or valor_UNICODE >= utilidades_cifras.LIMITE_UNICODE_PYTHON: # Ocorreu um erro na troca da base númerica escolhida para a base decimal. return dicionarios.retorna_erro_mensagem() mensagem_traduzida += chr(valor_UNICODE) return mensagem_traduzida
def traduzir_base_64(texto): if not texto: return dicionarios.retorna_erro_mensagem() codigo_binario = transformar_textoBase64_em_codigo_binario(texto) if not codigo_binario: # Um caractere fora da tabela da base 64 foi encontrado. return dicionarios.retorna_erro_mensagem() quant_de_iguais = texto.count('=') if quant_de_iguais == 1: codigo_binario = codigo_binario[:len(codigo_binario) - 2] elif quant_de_iguais == 2: codigo_binario = codigo_binario[:len(codigo_binario) - 4] return utf8.decodificar_UTF8_para_texto(codigo_binario)
def retornar_texto_encriptado(mensagem, funcao_encriptadora): if not mensagem: return dicionarios.retorna_erro_mensagem() mensagem_encriptada = '' for caractere in mensagem: mensagem_encriptada += funcao_encriptadora(ord(caractere)) + ' ' return mensagem_encriptada.strip()
def mensagem_nova_modo_apenas_letras(chave, mensagem): if not mensagem: return dicionarios.retorna_erro_mensagem() if chave: return cesar_troca_apenas_letras(chave, mensagem) else: return dicionarios.retorna_erro_chave()
def mensagem_nova_modo_varios_caracteres(chave, mensagem, dic_unicode): if not mensagem: return dicionarios.retorna_erro_mensagem() if chave: return cesar_troca_varios_caracteres(chave, mensagem, dic_unicode) else: return dicionarios.retorna_erro_chave()
def mensagem_nova(chave, mensagem): if not mensagem: return dicionarios.retorna_erro_mensagem() if chave: return criar_mensagem_com_caracteres_trocados(chave, mensagem) else: return dicionarios.retorna_erro_chave()
def codificar_base_64(texto): if not texto: return dicionarios.retorna_erro_mensagem() texto_codificado = '' indice_codigo = 24 texto_UTF8 = utf8.codificar_texto_para_UTF8(texto) tamanho_codigo = len(texto_UTF8) while indice_codigo <= tamanho_codigo: # Construindo o texto base 64... cada loop iterando sobre 24 digitos (4 blocos de 6). texto_codificado += dicionario_base_64[texto_UTF8[indice_codigo - 24: indice_codigo - 18]] texto_codificado += dicionario_base_64[texto_UTF8[indice_codigo - 18: indice_codigo - 12]] texto_codificado += dicionario_base_64[texto_UTF8[indice_codigo - 12: indice_codigo - 6]] texto_codificado += dicionario_base_64[texto_UTF8[indice_codigo - 6: indice_codigo]] indice_codigo += 24 # Finalizando o enconding... n_digitos_finais = indice_codigo - tamanho_codigo if n_digitos_finais == 24: # Todo o texto ja passou pelo encode, retornar o código base 64 pass elif n_digitos_finais == 16: # Para completar, faltou 16 digitos. Completar antepenultimo bloco com mais 4 zeros e adicionar 2 iguais no final. texto_UTF8 += '0000' texto_codificado += dicionario_base_64[texto_UTF8[indice_codigo - 24: indice_codigo - 18]] texto_codificado += dicionario_base_64[texto_UTF8[indice_codigo - 18: indice_codigo - 12]] + '==' else: # Faltou 8 digitos para completar. Antepenultimo recebe 2 zeros, e bloco faltante será substituido por um "=". texto_UTF8 += '00' texto_codificado += dicionario_base_64[texto_UTF8[indice_codigo - 24: indice_codigo - 18]] texto_codificado += dicionario_base_64[texto_UTF8[indice_codigo - 18: indice_codigo - 12]] texto_codificado += dicionario_base_64[texto_UTF8[indice_codigo - 12: indice_codigo - 6]] + '=' return texto_codificado
def imprimir_melhor_mensagem_adivinhada_apenas_letras(mensagem): lista_melhor_msg_e_indice = adivinhar_cesar_apenas_letras(mensagem) if lista_melhor_msg_e_indice: print( dicionarios.retorna_mensagens_adivinhador_cesar( lista_melhor_msg_e_indice[0], lista_melhor_msg_e_indice[1])) else: print( dicionarios.retorna_mensagem_com_bordas( dicionarios.retorna_erro_mensagem(), 127))
def codificar_texto_para_UTF8(texto): if not texto: return dicionarios.retorna_erro_mensagem() codigo_final_utf8 = '' for caractere in texto: num_binario = bases_numericas.converter_decimal_para_binario(ord(caractere)) if len(num_binario) <= 7: codigo_final_utf8 += transformar_7bits_UTF8(num_binario) elif len(num_binario) <= 11: codigo_final_utf8 += transformar_11bits_UTF8(num_binario) elif len(num_binario) <= 16: codigo_final_utf8 += transformar_16bits_UTF8(num_binario) elif len(num_binario) <= 21: codigo_final_utf8 += transformar_21bits_UTF8(num_binario) else: # "Passou do limite do programa" (é possível ler mais bytes, mas nesse programa não será lido...) return dicionarios.retorna_erro_mensagem() return codigo_final_utf8
def imprimir_apenas_letras(mensagem): lista_mensagens_apenas_letras = apenas_letras(mensagem) if lista_mensagens_apenas_letras: for num_chave, mensagem in enumerate(apenas_letras(mensagem)): print( dicionarios.retorna_mensagens_forca_bruta_cesar( num_chave + 1, mensagem)) else: print( dicionarios.retorna_mensagem_com_bordas( dicionarios.retorna_erro_mensagem(), 127))
def imprimir_varios_caracteres(mensagem): lista_mensagens_varios_caracteres = varios_caracteres(mensagem) if lista_mensagens_varios_caracteres: for num_chave, mensagem in enumerate(varios_caracteres(mensagem)): print( dicionarios.retorna_mensagens_forca_bruta_cesar( num_chave + 1, mensagem)) else: print( dicionarios.retorna_mensagem_com_bordas( dicionarios.retorna_erro_mensagem(), 127))
def test_subst_simples_varios_caracteres_mensagem_invalida(): assert subst_simples.encriptar_modo_varios_caracteres( ['ab', 'tg'], '') == dicionarios.retorna_erro_mensagem() assert subst_simples.traduzir_modo_varios_caracteres( ['abc', 'tg'], '') == dicionarios.retorna_erro_mensagem()
def test_subst_simples_apenas_letras_mensagem_invalida(): assert subst_simples.encriptar_modo_apenas_letras( ['ab', 'tg'], '') == dicionarios.retorna_erro_mensagem() assert subst_simples.traduzir_modo_apenas_letras( ['ab', 'tg'], '') == dicionarios.retorna_erro_mensagem()
def test_cifra_de_vigenere_apenas_letras_mensagem_invalida(): assert cifra_de_vigenere.encriptar_modo_apenas_letras( ['abc'], '') == dicionarios.retorna_erro_mensagem() assert cifra_de_vigenere.traduzir_modo_apenas_letras( ['abc'], '') == dicionarios.retorna_erro_mensagem()
def test_utf8_mensagem_invalida_tamanho_invalida(): assert utf8.decodificar_UTF8_para_texto( '1010101') == dicionarios.retorna_erro_mensagem()
def test_hexadecimal_traducao_invalido_2(): assert bases_numericas.transformar_hexadecimal_para_texto('FFFFFFFFF') == dicionarios.retorna_erro_mensagem()
def test_utf8_mensagem_invalida_nao_binaria_2(): assert utf8.decodificar_UTF8_para_texto( '101011ab') == dicionarios.retorna_erro_mensagem()
def test_base64_mensagem_invalida_2(): assert base_64.traduzir_base_64( '!??!') == dicionarios.retorna_erro_mensagem()
def test_base64_mensagem_invalida_1(): assert base_64.codificar_base_64('') == dicionarios.retorna_erro_mensagem()
def test_cifra_de_cesar_apenas_letras_mensagem_invalida(): assert cifra_de_cesar.encriptar_modo_apenas_letras( ['1'], '') == dicionarios.retorna_erro_mensagem() assert cifra_de_cesar.traduzir_modo_apenas_letras( ['1'], '') == dicionarios.retorna_erro_mensagem()
def test_utf8_mensagem_invalida_vazia(): assert utf8.codificar_texto_para_UTF8( '') == dicionarios.retorna_erro_mensagem() assert utf8.decodificar_UTF8_para_texto( '') == dicionarios.retorna_erro_mensagem()
def test_octal_mensagem_invalida(): assert bases_numericas.transformar_texto_para_octal('') == dicionarios.retorna_erro_mensagem() assert bases_numericas.transformar_octal_para_texto('') == dicionarios.retorna_erro_mensagem()
def test_octal_traducao_invalido_2(): assert bases_numericas.transformar_octal_para_texto('77777777777') == dicionarios.retorna_erro_mensagem()
def test_utf8_mensagem_invalida_codificacao_incorreta(): assert utf8.decodificar_UTF8_para_texto( '10101110') == dicionarios.retorna_erro_mensagem()
def test_cifra_de_cesar_varios_caracteres_mensagem_invalida(): assert cifra_de_cesar.encriptar_modo_varios_caracteres( ['1'], '') == dicionarios.retorna_erro_mensagem() assert cifra_de_cesar.traduzir_modo_varios_caracteres( ['1'], '') == dicionarios.retorna_erro_mensagem()
def test_binario_traducao_invalido_1(): assert bases_numericas.transformar_binario_para_texto('1111210') == dicionarios.retorna_erro_mensagem()