Estou tentando criar duas funções usando PyCrypto que aceitam dois parâmetros: a mensagem e a chave e, em seguida, criptografam / descriptografam a mensagem.
Encontrei vários links na web para me ajudar, mas cada um deles tem falhas:
Este em codekoala usa os.urandom, que é desencorajado por PyCrypto.
Além disso, não é garantido que a chave que dou à função tenha o comprimento exato esperado. O que posso fazer para que isso aconteça?
Além disso, existem vários modos, qual é o recomendado? Não sei o que usar: /
Finalmente, o que exatamente é o IV? Posso fornecer um IV diferente para criptografar e descriptografar, ou isso retornará com um resultado diferente?
Editar : Removida a parte do código, pois não era segura.
/dev/urandom
no UnixRespostas:
Aqui está minha implementação e funciona para mim com algumas correções e aprimora o alinhamento da chave e da frase secreta com 32 bytes e iv a 16 bytes:
fonte
Você pode precisar das duas funções a seguir:
pad
- para pad (ao fazer criptografia) eunpad
- para unpad (para descriptografar) quando o comprimento da entrada não for múltiplo de BLOCK_SIZE.Então você está perguntando o comprimento da chave? Você pode usar o md5sum da chave em vez de usá-lo diretamente.
Além disso, de acordo com minha pouca experiência no uso do PyCrypto, o IV é usado para misturar a saída de uma criptografia quando a entrada é a mesma; portanto, o IV é escolhido como uma sequência aleatória e usado como parte da saída de criptografia. use-o para descriptografar a mensagem.
E aqui está minha implementação, espero que seja útil para você:
fonte
pad
função está quebrada (pelo menos no Py3), substitua pors[:-ord(s[len(s)-1:])]
para que ela funcione entre as versões.Deixe-me responder à sua pergunta sobre "modos". AES256 é um tipo de cifra de bloco . Ele recebe como entrada uma chave de 32 bytes e uma string de 16 bytes, chamada de bloco e gera um bloco. Usamos o AES em um modo de operação para criptografar. As soluções acima sugerem o uso de CBC, que é um exemplo. Outro é chamado CTR, e é um pouco mais fácil de usar:
Isso geralmente é chamado de AES-CTR. Eu recomendaria cautela ao usar o AES-CBC com o PyCrypto . O motivo é que requer que você especifique o esquema de preenchimento , conforme exemplificado pelas outras soluções fornecidas. Em geral, se você não tomar muito cuidado com o preenchimento, há ataques que quebram completamente a criptografia!
Agora, é importante observar que a chave deve ser uma sequência aleatória de 32 bytes ; uma senha não é suficiente. Normalmente, a chave é gerada da seguinte maneira:
Uma chave também pode ser derivada de uma senha :
Algumas soluções acima sugerem o uso do SHA256 para derivar a chave, mas isso geralmente é considerado uma má prática criptográfica . Confira a Wikipedia para mais informações sobre os modos de operação.
fonte
Para alguém que gostaria de usar o urlsafe_b64encode e o urlsafe_b64decode, aqui está a versão que está funcionando para mim (depois de passar algum tempo com o problema unicode)
fonte
Você pode obter uma frase secreta de uma senha arbitrária usando uma função de hash criptográfica ( NÃO embutida no Python
hash
) como SHA-1 ou SHA-256. O Python inclui suporte para ambos em sua biblioteca padrão:Você pode truncar um valor de hash criptográfico apenas usando
[:16]
ou[:24]
e ele manterá sua segurança até o comprimento especificado.fonte
Grato pelas outras respostas que inspiraram, mas não funcionaram para mim.
Depois de passar horas tentando descobrir como ele funciona, eu vim com a implementação abaixo com o mais novo PyCryptodomex biblioteca (que é outra história como eu consegui configurá-lo atrás de proxy, no Windows, em um virtualenv .. ufa)
Trabalho sobre sua implementação, lembre-se de anotar as etapas de preenchimento, codificação e criptografia (e vice-versa). Você deve embalar e desembalar tendo em mente o pedido.
fonte
Para o benefício de outros, eis a minha implementação de descriptografia, que eu consegui combinando as respostas do @Cyril e do @Marcus. Isso pressupõe que isso seja recebido via solicitação HTTP com o encryptedText citado e a base64 codificada.
fonte
Outra visão sobre isso (fortemente derivada das soluções acima), mas
testado com python 2.7 e 3.6.5
fonte
Eu usei tanto
Crypto
ePyCryptodomex
biblioteca e é incrivelmente rápido ...fonte
É um pouco tarde, mas acho que isso será muito útil. Ninguém menciona o esquema de uso como o preenchimento PKCS # 7. Em vez disso, você pode usá-lo nas funções anteriores para preencher (quando criptografar) e unpad (quando descriptografar) .i fornecerá o código-fonte completo abaixo.
fonte
codificação utf-8 compatível
fonte
fonte