Jump to content

[Resolvido] Criptografia


Psycho_Mind
 Share

Recommended Posts

Boas.

A partir do pressuposto em que Oi <- EK0 (fi, Di), ou seja, Objeto i <- encriptação com chave simétrica do owner (ficheiro i, digest ficheiro i), onde já estou a obter o digest do ficheiro i através de MD5, ja criei a chave (com RSA) e consigo carregar o ficheiro.

O meu problema agora prende-se na 'fórmula' anteriormente indicada, em particular como consigo em python condensar EK0 (fi, Di) para obter Oi. Pressuponho que 1º deverei ter um qualquer algoritmo para efetuar a encriptação, mas não sei como o vou utilizar tendo em conta o pressuposto indicado.

Obrigado pro qualquer ajuda que possam dar.

Link to comment
Share on other sites

Não sei se sou muito estupido ou não mas de qualquer maneira não perçebi metade do que disses-te x)

Importas-te de explicar melhor o problema em que pretendes que te ajudemos?

A maneira como está feita a "fórmula" pareçe-me bastante pareçida com programação em Basic e tudo o que disses-te relacionado com MD5 e etc. pareçeu-me familiar mas o pessoal vê o tópico e não sabe-te responder e passa ao próximo, por isso há 20 visualizações e agora a minha resposta.

Tens que explicar melhor o que pretendes para o pessoal que perçeba disso apareçer aqui e conseguir responder-te.

Cumprimentos, Ice_Monster

Edited by icemonster2
Link to comment
Share on other sites

Obrigado pela dica.

A ver se me explico melhor...

Tenho de através da utilização de uma chave simétrica previamente criada (com RSA), fazendo uso de uma qualquer cifra (se souberem indicar a melhor para o caso agradecia, se não irei possivelmente utilizar RSA) encriptar dois parametros: um ficheiro (de qualquer tipo) e um valor (digest que já calculei previamente através de MD5) por forma a obter o tal objeto i (e.g. variável).

Este pressupostos vem então de: Oi <- EK0 (fi, Di). A minha duvida esta relacionado em como consigo efetuar isto utilizando o python. Encriptar os dois parametros fazendo uso de uma chave simétrica, com uma qualquer cifra.

Não sei se melhorou, se andei à volta do mesmo que já tinha dito anteriormente, mas não me consigo explicar melhor :S

Link to comment
Share on other sites

A tua questão continua a parecer confusa. Misturas chaves simétricas com RSA. Depois, metes aí uma expressão Oi <- EK0 (fi, Di), sem dizeres o que significa cada um dos elementos da expressão.

Bem, investiga o PyCrypto, em particular a parte do AES (uma cifra simétrica), que deves conseguir resolver o problema que tens em mãos.

Link to comment
Share on other sites

A tua questão continua a parecer confusa. Misturas chaves simétricas com RSA. Depois, metes aí uma expressão Oi <- EK0 (fi, Di), sem dizeres o que significa cada um dos elementos da expressão.

Bem, investiga o PyCrypto, em particular a parte do AES (uma cifra simétrica), que deves conseguir resolver o problema que tens em mãos.

A expressão tenho logo na minha primeira mensagem o que são cada um dos elementos: Oi <- EK0 (fi, Di), ou seja, Objeto i <- encriptação com chave simétrica do owner (ficheiro i, digest ficheiro i) e que volto a indicar na 2ª mensagem.

"Misturas chaves simétricas com RSA": as chaves que estou a criar (privadas e publicas) são cifradas fazendo uso do RSA, mas as simétricas pensei de utilizar também, mas assim sendo não é pertinente de criar chaves simétricas utilizando este algoritmo criptográfico, sendo o mais correto como indicas AES, não é? Mas para as privadas e publicas pode ser AES ou RSA, correto?

Vou então dar uma olhada ao PyCrypto.

Obrigado.

Edited by Psycho_Mind
Link to comment
Share on other sites

Se queres usar criptografia simétrica (AES é uma cifra simétrica), precisas de uma única chave. Um par de chaves (pública/privada) é necessário quando usas criptografia assimétricas (RSA é uma cifra assimétrica). Ou seja, ou queres usar o RSA (criptografia assimétrica), ou queres usar criptografia simétrica (e nesse caso não faz sentido usar o RSA, mas sim o AES, entre outros). Também dá para misturar RSA e AES, mas nunca usas usas o RSA como cifra simétrica.

(Este texto deve-te ajudar a perceber melhor os conceitos.)

Link to comment
Share on other sites

Se queres usar criptografia simétrica (AES é uma cifra simétrica), precisas de uma única chave. Um par de chaves (pública/privada) é necessário quando usas criptografia assimétricas (RSA é uma cifra assimétrica). Ou seja, ou queres usar o RSA (criptografia assimétrica), ou queres usar criptografia simétrica (e nesse caso não faz sentido usar o RSA, mas sim o AES, entre outros). Também dá para misturar RSA e AES, mas nunca usas usas o RSA como cifra simétrica.

(Este texto deve-te ajudar a perceber melhor os conceitos.)

Então faltava-me mesmo perceber esse 'conceito' que explicas, que acaba por se tornar uma resolução para algo que estava a pensar incorretamente sem saber.

Mas assim mantem-se uma outra duvida e pergunto o seguinte: partindo daquilo que necessito, que passa por ter que ter uma chave simétrica (como me explicas-te utilizando AES para a criar), a partir da qual irei encriptar um determinado ficheiro e um (valor de) digest, e daqui vem então EK0 (fi, Di).

Esta parte é que me está a fazer confusão. Tenho a chave simetrica criada, tenho o ficheiro pretendido e tenho o valor do digest. Como faço então e atraves de que criptografia para conseguir utilizar a tal chave simétrica para encriptar o ficheiro e o digest ?

Link to comment
Share on other sites

O AES é usado para cifrar os dados, e não propriamente para criar chaves.

Na página que indiquei anteriormente tens um exemplo de como usar o AES em Python:

from Crypto.Cipher import AES
from Crypto import Random

key = b'Sixteen byte key' # definição da chave (ou password)
iv = Random.new().read(AES.block_size) # definição de um vector de inicialização aleatório, necessário quando se usa o AES em modo CFB
cipher = AES.new(key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn') # resultado de cifrar o texto, mais o vector de inicialização (necessário para recuperares o conteúdo original)

Vais ter que substituir a constante b'Attack at dawn' por uma variável que contém os bytes de fi e Di concatenados.

Convém também substituir a password/chave (b'Sixteen byte key'). Deverá ter 16, 24 ou 32 bytes.

(Podes eliminar a necessidade do iv usando o modo AES.MODE_ECB, mas este não é tão seguro, e pode expor padrões da mensagem cifrada.)

Link to comment
Share on other sites

O AES é usada para cifrar os dados, e não propriamente para criar chaves.

Na página que indiquei anteriormente tens um exemplo de como usar o AES em Python:

from Crypto.Cipher import AES
from Crypto import Random

key = b'Sixteen byte key' # definição da chave (ou password)
iv = Random.new().read(AES.block_size) # definição de um vector de inicialização aleatório, necessário quando se usa o AES em modo CFB
cipher = AES.new(key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn') # resultado de cifrar o texto, mais o vector de inicialização (necessário para recuperares o conteúdo original)

Vais ter que substituir a constante b'Attack at dawn' por uma variável que contém os bytes de fi e Di concatenados.

Convém também substituir a password/chave (b'Sixteen byte key'). Deverá ter 16, 24 ou 32 bytes.

(Podes eliminar a necessidade do iv usando o modo AES.MODE_ECB, mas este não é tão seguro, e pode expor padrões da mensagem cifrada.)

Então o AES será uma boa solução para eu efetuar as encriptações que irei precisar. Vou então experimentar pelo exemplo que me indicas.

Mas seguindo este pressuposto, e sendo o AES uma cifra simétrica, só será utilizada para cifrar dados que façam uso de uma chave simétrica, como no caso que referia, mas no caso de ter que utilizar para cifrar a chave publica ou privada (assimetricas), aqui já não devo utilizar o AES, correto? Mas sim por exemplo o RSA ?

Como indicas que o AES é 'preferencialmente' utilizado para a cifra de dados, qual poderá ser uma criptografia a utilizar para criar as chaves simetricas ?

Link to comment
Share on other sites

Continuas as fazer perguntas que denotam desconhecimento do básico da criptografia, pelo que era capaz de ser melhor começares por leres uns artigos sobre o assunto (tens no portal da downloads alguns recursos de criptografia).

Não percebi muito bem em que contexto é que o problema deste tópico surgiu, mas parece-me que estás tentar fazer coisa que não percebes devidamente.

Link to comment
Share on other sites

Continuas as fazer perguntas que denotam desconhecimento do básico da criptografia, pelo que era capaz de ser melhor começares por leres uns artigos sobre o assunto (tens no portal da downloads alguns recursos de criptografia).

Não percebi muito bem em que contexto é que o problema deste tópico surgiu, mas parece-me que estás tentar fazer coisa que não percebes devidamente.

De fato a criptografia não é o meu forte, tanto que só recentemente tive a necessidade de ter que entrar nesta área, em particular nestes pontos que temos vindo a falar. Tenho tentado recolher o máximo de informação que consigo mas sem duvida que há coisas que me escapam e como dizes e bem, é algo que ainda não percebo e compreendo.

Vou continuar a tentar fazer mais algumas pesquisas... mas nestas Q & A que tivemos já me ajudas-te a perceber alguns conceitos que afinal ainda não tinha compreendido. Mas visto ainda ser leigo na matéria, e não ter compreendido muito daquilo que fui encontrando, procurei aqui mais alguns esclarecimentos.

Link to comment
Share on other sites

Eu já consegui perceber o funcionamento das cifras simétricas e assimétricas. No meu caso vou precisar de utilizar ambas.

Mas vou precisar também de criar (pares) chaves assimétricas e chaves simétricas.

Desta forma estou a criar os pares de chaves (publica/privada) fazendo uso de uma cifra assimétrica (RSA) com o M2Crypto:

print "Generating a 1024 bit private/public key pair for CSP..."
CSP = M2Crypto.RSA.gen_key (1024, 65537)
CSP.save_key ('CSP-private.pem', None) #save CSP private key
CSP.save_pub_key ('CSP-public.pem') #save CSP public key

A minha ultima mensagem vai neste sentido e que é aquilo que ainda não consegui de todo perceber, mais ainda no seguimento daquilo que me tinhas dito e que me deixou confuso.

Indo por partes... No caso das chaves assimetricas que estou a criar atraves de RSA, depois precisarei de cifrar dados fazendo uso dessas mesmas chaves. Seguindo o que me indicas-te terei de fazer uso de uma cifra assimetrica para este efeito, dai ter perguntado se novamente posso fazer uso da cifra RSA, que foi o que me deixou sem perceber o que me estavas a dizer.

Analogamente terei de criar chaves simétricas fazendo uso de uma cifra simétrica.

Por isso perguntei se poderia ser AES, ao qual me respondes-te que o AES é preferencialmente utilizado na cifra de dados e não na criação de chaves. Dai a minha pergunta, qual seria a melhor cifra para criar chaves simétricas. Com essa chave simétrica (EK0) poderei então utilizar o AES (como indicas-te no código anterior) para cifrar os dados (fi, Di).

Mas visto se tratar de uma chave que serve para encriptar e desencriptar, penso que se utilizar por exemplo um ficheiro com qualquer coisa lá dentro escrita pode ser a minha chave, e assim crio a chave simétrica.

Edited by Psycho_Mind
Link to comment
Share on other sites

Uma cifra (como o AES ou RSA) serve para cifra dados. A função de uma cifra não é gerar chaves, embora certas cifras precisem de chaves com geradas com algoritmos específicos.

Parece-me que a confusão que estás a fazer deriva de estares a inverter a importância do processo cifragem em relação ao processo de geração da chave.

Uma chave para uma cifra simétrica é muitas vezes um qualquer conjunto de bytes, por vezes com algumas restrições no tamanho (e.g. o AES requer chaves de 128, 192, ou 256bits). Para o AES, um conjunto de 16 caracteres (de 1byte cada um) já te dá uma chave de 128bits.

Um par de chaves para uma cifra assimétrica já não é um qualquer conjunto de bytes. Aqui precisas de algoritmos específicos, dependendo da cifra assimétrica usada, entre outras coisas (para o RSA geras pares com determinadas características, para o ElGamal geras pares com características completamente diferentes).

Adicionalmente, por norma começas por escolher a cifra, e depois vez quais as restrições às chaves para essa cifra. Isto é, não começas por gera um chave para o RSA e depois vais decidir qual a cifra a usar, começas sim por escolher a cifra, e depois a forma como geras a chave é determinada pela cifra (mas mais uma vez, a função das cifras não é gerar chaves).

Estares a gerar chaves RSA sem saberes que cifra vais usar (e sem sequer teres explicado porque é que queres usar um determinado tipo de cifras) não faz muito sentido. Tendo em conta as misturas que foste fazendo, também já não estou certo de que tipo de criptografia precisas (nem por que é que precisas das duas). Seria melhor descrever o problema que tens (e.g., impedir que outros leiam um ficheiro, assinar um documento, enviar uma mensagem secreta sem acordo prévio de chaves, ...), em vez de apresentares a solução que queres implementar, donde é difícil perceber qual a melhor forma de resolver o problema.

Resumindo:

- começas por definir o problema que queres resolver com criptografia;

- analisas os diferentes tipos de criptografia, e escolhes aquele que responde ao problema que tinhas anteriormente;

- escolhes um algoritmo para o tipo de criptografia escolhida (e.g. RSA para cifra assimétrica, SHA1 para funções de hash)

- de acordo com o algoritmo escolhido e a sua implementação, geras a(s) chave(s), vectores de inicialização, etc.

(Sugeria-te também que evitasses pensar em "chaves simétricas" ou "chaves assimétricas". Eu sei que estes termos são usados, mas aquilo que é simétrico/assimétrico é mais a cifra do que a chave.)

Link to comment
Share on other sites

A utilização destas cifras e chaves (pelo menos para já) tem o propósito de enviar para um CSP (cloud) dados (ficheiros) encriptados. Posso definir 3 momentos diferentes para efetuar esta encriptação:

1) Obter o digest para cada ficheiro, que efetuei utilizando MD5;

2) Encriptação com a chave simétrica do owner (ficheiro, digest do ficheiro); (o tal, Oi <- EK0 (fi, Di)). Dai precisar de uma chave simétrica e cifra para efetuar a encriptação.

3) Encriptação com chave publica do CSP (Encriptação chave privada do owner (objeto resultante do passo 2)). E aqui precisar das chaves publica e privada

ou seja,

1) Di <- MD5(fi)

2) Oi <- EK0 (fi, Di) , onde EK0 é a chave simétrica

3) EOi <- EKpusp(EKprown(Oi)) , onde pusp é a chave publica do CSP, prown é a chave privada do owner

A minha intenção seria utilizar as cifras AES (como cifra para o ponto 2) e RSA (como cifra para o ponto 3).

Assim terei uma chave simétrica, um simples ficheiro de texto com algo lá dentro (e.g. 12345) e utilizarei o AES como cifra.

As chaves publica/privada que preciso, criadas como mostrei no código anterior, que serviriam para o ponto 3, sendo que iria utilizar cifra RSA para poder efetuar a encriptação. --> se bem que agora foquei confuso sobre se posso criar as mesmas utilizando RSA como fiz e depois utilizar novamente a cifra RSA para efetuar a encriptação.

Esta seria a minha ideia.

Link to comment
Share on other sites

Para o ponto 2, tens o código que mostrei anteriormente. A variável key vai conter aquilo que tu chamas de chave simétrica. É suposto serem 16bytes, mas tirando isso a chave é basicamente uma password como outra qualquer. Contudo, uma coisa que se costuma fazer é usar um hash da password como chave.


from Crypto.Cipher import AES
from Crypto import Random
from Crypto.Hash import SHA256

# bytes que vamos cifrar
texto = b'conteudo a cifrar'

# definicao da password a partir da qual vamos criar uma chave
password = 'uma password qualquer'

# geracao da chave de 16bytes a partir da password
h = SHA256.new()
h.update(password)
key = h.digest()[0:16]

# geracao do vector de inicializacao de 16bytes
iv = Random.new().read(16) 

# criacao do criptograma (texto cifrado)
cipher = AES.new(key, AES.MODE_CFB, iv)
criptograma = iv + cipher.encrypt(texto)

# recuperacao do texto limpo, a partir do criptograma
cipher = AES.new(key, AES.MODE_CFB, criptograma[0:16])
texto_recuperado = cipher.decrypt(criptograma[16:])

print(texto_recuperado)
print(texto)

Para o ponto 3, não percebi muito bem qual o objectivo de cifrares Oi com a chave privada do owner. De qualquer modo, tens aqui como usar o PyCrypto para cifrar dados com RSA. Nesse exemplo a chave é importada de um ficheiro .der, mas também podes passar ao método RSA.importKey um ficheiro .pem como o que geraste no exemplo que apresentaste.

se bem que agora foquei confuso sobre se posso criar as mesmas utilizando RSA como fiz e depois utilizar novamente a cifra RSA para efetuar a encriptação.

Tu não usaste a cifra RSA para criar as chaves. Usaste um algoritmo de geração de chaves para RSA.

Link to comment
Share on other sites

Para o ponto 2, tens o código que mostrei anteriormente. A variável key vai conter aquilo que tu chamas de chave simétrica. É suposto serem 16bytes, mas tirando isso a chave é basicamente uma password como outra qualquer.

Para o ponto 3, não percebi muito bem qual o objectivo de cifrares Oi com a chave privada do owner. De qualquer modo, tens aqui como usar o PyCrypto para cifrar dados com RSA. Nesse exemplo a chave é importada de um ficheiro .der, mas também podes passar ao método RSA.importKey um ficheiro .pem como o que geraste no exemplo que apresentaste.

Tu não usaste a cifra RSA para criar as chaves. Usaste um algoritmo de geração de chaves para RSA.

Todos esses passos que descrevi fazem parte de um artigo (o que consta no ponto 3 está assim definido), logo são escolhas que faço baseado nas notações dadas pelo mesmo. Exceto as cifras usadas que não são indicadas.

Deixa-me desde já agradecer-te por estas explicações, ajudaram e muito a conseguir perceber muitas coisas que não estavam nada claras. Acho que devia de te 'contratar como orientador' 🙂

Vou então tentar efetuar as implementações segundo aquilo que falámos.

Obrigado.

Edited by Psycho_Mind
Link to comment
Share on other sites

Entretanto editei o meu post anterior para mostra como se pode gerar uma chave mais segura para usar com o AES. O exemplo com o AES está também agora mais completo.

Okay. Obrigado.

Assim sendo a variável texto será como dizias os bytes de fi e Di concatenados. Por concatenados, entendes literalmente efetuar a concatenação do ficheiro (fi) com o resultado (Di) do ponto 1) ? Mas aqui de alguma forma obter os bytes das duas variáveis e concatenar os mesmos ? Mas aqui de alguma forma obter os bytes das duas variáveis e concatenar os mesmos ?

Edited by Psycho_Mind
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.