segunda-feira, 2 de janeiro de 2017

Criptografia usando python

 CRIPTOGRAFIA
 .É o estudo a aplicação de técnicas para a comunicação e armazenamento seguro de dados
em sistemas computacionais(entre outros).
 .A palavra Criptografia vem do grego "Kriptós","oculto" e "Graphein","escrita", portanto
"escrita oculta ou(secreta)".

- Encriptação: é a conversão de dados legíveis pata um formato ilegível(texto cifrado)
por pessoas não-autorizadas, usando uma chave e um algoritmo criptográfico, seu
objetivo é proteger a privacidade ao armazenamos dados ou trocarmos informações
com outras pessoas. O receptor da mensagem encriptada pode decripta-la e ler seu conteudo,
no formato original.

- Criptoanálise: é o processo de transformação de dados cifrados em dados legíveis sem
que se conheça a chave de encriptação. Portanto trata-se de "quebrar" a encriptação dos
dados para obter acesso ao conteudo das menssagens


- Criptografia de Chave Privada ou Simétrica;
- Criptografia de Chave Pública  ou Assimétrica.
- Hash


 [*] Criptografia de chave Publica:
utiliza duas chaves distintas,de modo a obtermos comunicação segura atravez de canais de
comunicação inseguros.
Trata-se de uma criptografia Assimétrica pelo fato de usar um par de chaves diferentes.
cada participante possui uma chave chave pública e uma chave privada. A chave privada é
secreta e so o proprietario a conhece, ao passo que a chave publica é compartilhada com
todos que se comunicarem conosco.


 [*] Criptogafia de chave Privada:
       utiliza uma unica chave.
O emissor utiliza essa chave para encriptar a mensagem, e o receptor utiliza a mesma chave
para decripta-la(chave compartilhada);
por utilizar a mesma chave na encriptação, trata-se de uma tecnica de encriptação simetrica.

- Vamos conhecer 2 tipos de criptografia de chave privada:
  - DES
  - AES

PARA OS EXEMPLOS DE CRIPTOGRAFIA NO PYTHON
VAMOS UTILIZAR O MODULO "CRYPTO"
 [+] instalação:
     Linux(debian/ubunto e derivados): sudo apt-get install python-crypto
     Windows e Mac: vai no link https://pypi.python.org/pypi/pycrypto


[+] DES(Data Encryption Standard):
 - Criado pela IBM em 1977.
 - Chave de 56 bits
    . 72 quatrilhões de combinações.
 - Valor auto, mas não para computadores potentes.
 - Em 1997, quebrada por "força bruta".
 - Esse algoritimo possui um tamanho de chave de 8 bytes.
 - E sua criptografia so ira funcionar em texto de tamanho igual ou multiplo de 8.

 [*]Exemplo de DES:

 >>> from Crypto.Cipher import DES
 >>> chave = "12345678"
 >>> des = DES.new(chave, DES.MODE_ECB)
 >>> texto_claro = "Uni-hack"
 >>> texto_cifrado = des.encrypt(texto_claro)
 >>> print (' [+] cifrado %s '% texto_cifrado)
 >>> print (' [+] decifrado %s '% des.decrypt(texto_cifrado))


[+] AES(Advanced Encryption Standard):
 - Anunciado no final 2001.
 - Novo padrão de criptografia adotado pelo governo americano em 2002
 - Usa blocos de 128 bits.
   . chaves de 128, 192, 256 bits.
 - Para quebra-lo um computador potente levaria milhões de anos...
 - Este algoritmo possui um tamanho de chave de de 16, 24 ou 32 bytes
 - E sua criptografia so ira funcionar em textos de tamanho igual ou multiplo de 16.


 [*]Exemplo de AES:
 >>> from Crypto.Cipher import AES
 >>> chave = "123456789abcdef"
 >>> aes = AES.new(chave, AES.MODE_ECB)
 >>> texto_claro = "Uniao-HackBrasil"
 >>> texto_cifrado = des.encrypt(texto_claro)
 >>> print (' [+] cifrado %s '% texto_cifrado)
 >>> print (' [+] decifrado %s '% aes.decrypt(texto_cifrado)6501)




 E se eu quiser criptografar um arquivo? É possivel?
 SIM, para provar isso ... vamos criptografar uma imagem:

import base64
from Crypto.Cipher import AES

#criando uma chave de criptografia
chave = "0123456789ABCDEF"
aes = AES.new(chave, AES.MODE_ECB)

#recebe o arquivo a ser criptografado

arquivo = raw_input()

#ler o arquivo e corrigir o seu tamanho
#o tanho dever ser um multiplo de 16 caracters

 arq_entrada = open(arquivo, "r")
arq_entrada = arq_entrada.read()

#caso o tamanho nao seja muliplo de 16 ele verifica quantos caracteres
#faltam para prencher e os preenche com o caractere '#'

cryptoSaida = arq_entrada+'#'*(16-len(arq_entrada)%16)

#criptografando o arquivo corrigido
#alem disso vamos colocar os dados criptografados
#em uma forma que caracteres estranhos nao aparecam

texto_cifrado = base64.b32encode(aes.encrypt(cryptoSaida))

#nesta etapa eh realizado os passos anteriores mas desta vez no titulo
titulo_novo=base64.b32encode(aes.encrypt(arquivo+'#'*(16-len(arquivo)%16)))

arq_saida = open(titulo_novo,'w')
arq_saida.write(texto_cifrado)
arq_saida.close()


  
Para descriptografar fizemos aqui outro programinha...
import base64
from Crypto.Cipher import AES

#criando uma chave de criptografia
chave = "0123456789ABCDEF"
aes = AES.new(chave, AES.MODE_ECB)

#recebe o arquivo a ser criptografado
arquivo = raw_input()


#ler o arquivo
arq_entrada = open(arquivo, "r")
#esta etapa iremos decodificar os caracteres para sua forma original
arq_entrada = base64.b32decode(arq_entrada.read())

#vamos recuperar o nome do arquivo e retirar os
#caracteres adicionais que colocamos na etapa passada

titulo_antigo=aes.decrypt(base64.b32decode(arquivo))
titulo_antigo=titulo_antigo.rstrip('#')

#vamos repetir o processo para o conteudo do arquivo
texto_recuperado=aes.decrypt(arq_entrada)
texto_recuperado=texto_recuperado.rstrip('#')

#e por fim vamos recriar o arquivo na sua forma original
arq_saida2 = open(titulo_antigo,"w")
arq_saida2.write(texto_recuperado)


Espero que gostem da postagem.. continue nos dado apoio.. obg :D