• Nenhum resultado encontrado

O processamento digital de imagem do mais genérico ao mais sofisticado pode ser descrito pela imagem abaixo.

A aquisição da imagem é feita por dispositivos que as captam; um determinado computador é responsável pelo processamento inicial desta imagem – o termo computador pode ser trocado por processador; seu armazenamento pode ser feito em discos ópticos, fitas e discos magnéticos, pendrives, banco de dados, etc.; a saída é o

ponto que receberá essas informações logo após seu processamento, pode ser o monitor do próprio processador ou então outro computador, impressoras, etc.

É muito comum enviar as imagens do ponto de processamento ao ponto de saída via rede interna ou externa.

Figura 5 - Esquema de processamento de imagens Fonte: Adaptado de Filho e Neto (1999)

A imagem a ser transportada e/ou arquivada pode ser confidencial. Assim como no caso das mensagens, são necessárias implementações de criptografia para assegurar que as imagens cheguem ao seu destino final (rede ou armazenamento) íntegras e com nenhuma perda, caso sejam interceptadas no canal durante a comunicação ou algum intruso acesse o local onde elas estão armazenadas.

Além disso deve ser possível recuperar as imagens criptografadas sem que o processo tenha as danificado. Assim como na criptografia de mensagens, são utilizados algoritmos para “embaralhar” a imagem.

As técnicas de criptografia em imagens encontram aplicação em ambientes em que imagens confidenciais, por exemplo, imagens médicas, contratos, escrituras, mapas entre outros, precisam ser armazenadas ou transmitidas através de um canal de comunicação inseguro, a internet (SILVA ET AL, 2013, p. 02).

Dados de texto puro são criptografados nos algoritmos por meio de funções matemáticas que invertem, somam, multiplicam, etc. seus bits correspondentes. Nas

imagens não é diferente, elas são submetidas a várias funções matemáticas (as mesmas utilizadas em texto) até se tornarem imagens criptografadas.

Para realizar um processamento de imagens é importante utilizar um algoritmo que seja eficiente, pois serão criptografados vários blocos de bits simultaneamente, e esses blocos de informação criptografada devem ser agrupados de tal forma que no momento em que eles forem decriptografados estejam na ordem correta, para não corromper e inutilizar a imagem.

“Uma imagem é composta por uma quantidade grande de pixels, dessa forma é imprescindível a escolha de um algoritmo criptográfico adequado que garanta a eficiência da velocidade × segurança.” (SILVA ET AL, 2013, p. 06).

A criptografia de imagens utilizada neste trabalho é demonstrada nos quadros abaixo e foi implementada por Dhanoop Bhaskar, em seu artigo “Java – Encryption and Decryption of an Image Using Blowfish Algorithm”.

O autor implementou a criptografia de imagens utilizando o algoritmo Blowfish, mas a mesma implementação de leitura, acesso aos bits e gravação pode ser utilizada para todos os algoritmos testados neste trabalho. A variável derectoryPath contém o caminho principal onde estarão salvas as pastas das imagens (originais, criptografadas e decriptografadas).

A chamada aos métodos de criptografia e decriptografia recebem como parâmetro essas variáveis de acordo com sua utilização.

String directoryPath; String fileToEncrypt; String encryptedFile; String decryptedFile;

encrypt(directoryPath + imgOriginal, directoryPath + imgEncriptada); decrypt(directoryPath + imgEncriptada, directoryPath + imgDecriptada);

Quadro 21 - Métodos para criptografar/decriptografar imagens Fonte: Bhaskar (2013)

A variável fileToEncrypt contém o caminho específico da imagem a ser criptografada; a encryptedFile contém o caminho da pasta onde serão salvas (e como serão nomeadas) as imagens criptografadas, esta mesma variável indicará ao método de decriptografia onde foram salvas as imagens criptografadas; a decryptedFile

contém o caminho especifico onde serão salvas (e como serão nomeadas) as imagens descriptografadas.

Os métodos descritos anteriormente são representados no quadro a seguir. O método encrypt é o responsável pela encriptação e o decrypt pela decriptação.

O parâmetro srcPath utilizado no método encrypt é o caminho onde se encontra a imagem original, seu nome e sua extensão; a utilização deste mesmo parâmetro no método decrypt indica o caminho onde se encontra a imagem encriptada, seu nome e sua extensão.

O parâmetro destPath utilizado no método encrypt é o caminho onde será gravada a criptografia, o nome e a extensão que será atribuída ao arquivo; a utilização deste mesmo parâmetro no método decrypt indica o caminho onde será gravada a decriptografia, o nome e a extensão que será atribuída ao arquivo.

encrypt(String srcPath, String destPath){} decrypt(String srcPath, String destPath){}

Quadro 22 - Métodos de criptografia/decriptografia e seus parâmetros Fonte: Bhaskar (2013)

Para criptografar uma imagem é necessário obter cada um de seus bits, e então codificá-los, este processo é demonstrado no quadro abaixo. A classe File do Java foi utilizada para representação do caminho onde são encontrados os arquivos.

A variável rawFile recebe o caminho da imagem a ser criptografada/decriptografada; a encryptedFile é utilizada no método de encriptação e recebe o caminho onde será salva a imagem encriptada; a decryptedFile é utilizada no método de decriptação e recebe o caminho onde será salva a imagem decriptada; a inStream é responsável pela leitura dos bytes da imagem; a outStream é a responsável pela escrita dos bytes no arquivo de destino.

São lidos todos bits dos bytes e criptografados/decriptografados todos os blocos gerados no laço while(). Após o fim da criptografia/decriptografia (método doFinal()), são encerrados o inputStream e o outputStream finalizando o processo.

A variável cipher é a cifra gerada a partir do algoritmo especificado, processo detalhado no capítulo 2.6. As modificações realizadas no algoritmo implementado por

Dhanoop Bhaskar foram as alterações nos caminhos das imagens e alguns nomes de variáveis.

É importante frisar que as classes FileInputStream e FileOutputStream fazem a leitura e a escrita em arquivos com qualquer extensão, não somente com arquivos de imagens.

File rawFile = new File(srcPath); File encryptedFile = new File(destPath); File decryptedFile = new File(destPath); inStream = new FileInputStream(rawFile);

outStream = new FileOutputStream(encryptedFile); byte[] buffer = new byte[1024];

int len;

while ((len = inStream.read(buffer)) > 0) {

outStream.write(cipher.update(buffer, 0, len)); outStream.flush(); } outStream.write(cipher.doFinal()); inStream.close(); outStream.close();

Quadro 23 - Criptografia/decriptografia de imagens Fonte: Bhaskar (2013)

Arquivos de imagens de extensão JPG são usualmente utilizados na Internet por ocuparem menor tamanho em disco se comparados com outras extensões. A possibilidade de compressão realizada pelo JPG faz-com que a qualidade das imagens seja reduzida, mas sem perdas significativas. O JPG é capaz de criar blocos de pixels, ou seja, menos informações a serem armazenadas e/ou transmitidas pela rede.

Os dados criptografados poderiam ser salvos em arquivos de qualquer extensão, mas tendo em vista as vantagens de se trabalhar com arquivos de imagens JPG, este será o padrão adotado neste trabalho.

Usualmente os dados a serem enviados em um canal são arquivos de texto, mas segundo os resultados apresentados pelos autores do artigo “Criptografia assimétrica de imagens utilizando algoritmo RSA”:

A geração do arquivo de texto resultava em um arquivo maior do que a geração da imagem. Uma imagem cifrada utilizando o método de gerar o arquivo de texto a cifragem tinha um resultado com 9MB de tamanho em disco, enquanto no método de gerar a imagem a mesma imagem cifrada tinha 1,26MB (SILVA ET AL, 2013, p. 04).

Os autores ainda citam que o tempo decorrido para gravar um arquivo de imagem era três vezes mais rápido do que gerar um arquivo de texto com os dados criptografados. No artigo acima citado, os autores criptografaram cada banda de RGB da imagem e geraram as imagens a partir delas utilizando o algoritmo RSA.

Já neste trabalho foram criptografados os bits da imagem retornados à partir de uma função da linguagem Java, fazendo uma comparação de alguns dos algoritmos de criptografia.

O escopo do artigo referenciado é o mesmo deste trabalho – medir tempo e eficiência, então seus resultados foram considerados, contribuindo para bem embasar a utilização da extensão JPG para gerar os arquivos criptografados/decriptografados neste trabalho.

Três pontos são importantes para a escolha do melhor algoritmo de criptografia de imagem: tempo decorrido para criptografia/decriptografia, alteração nos bytes do arquivo criptografado e integridade do arquivo descriptografado.

Foram testados estes três fatores neste trabalho, em cada um dos algoritmos implementados (ver capítulo 2.6). Os resultados são detalhados no capítulo 4.