Enviado em 20/06/2017 - 23:41h
Boa noite a todos, gostaria de pedir ajuda num trabalho que eu tenho que fazer para a disciplina de Sistemas Operacionais. No caso, o líder do meu grupo é um aluno da pós que escolheu o tema Criptografia Leve Simon. Ele nos forneceu o código de como funciona essa criptografia para 64bits e nos disse que teríamos que criar um arquivo txt de 100mb para ser lido por esse algoritmo. Portanto a gente tem que dividir esse arquivo txt em trechos de 64bits pra que o algoritmo funcione. O algoritmo em si recebe no vetor text64[2] os 64bits do arquivo txt, metade na posição text64[0] e a outra metade (32bits) na posição text64[1]. Portanto o orientador sugeriu que eu lesse 4 caracteres do arquivo txt e armazenasse na posição text64[0] e mais 4 caracteres e armazenasse na posição text64[1], realizando a criptografia e fizesse isso sucessivamente dentro de um laço até que o arquivo txt inteiro tenha sido criptografado.#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <omp.h>
static uint8_t z[62] =
{1,1,0,1,1,0,1,1,1,0,1,0,1,1,0,0,0,1,1,0,0,1,0,1,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,1,0,0,1,1,1,0,0,1,1,0,1,0,0,0,0,1,1,1,1};
#define ROTATE_LEFT_64(x,bits) ( (x << bits) | ((x & 0xffffffffffff) >> (64-bits)) )
#define ROTATE_RIGHT_64(x,bits) ( ((x & 0xffffffffffff) >> bits) | (x << (64-bits)) )
void KeyExpansion64 (uint64_t k[], uint8_t m, uint8_t T)
{
uint8_t i;
uint64_t tmp;
// #pragma omp parallel for private(i,tmp)
for (i = m; i<T; i++)
{
tmp = ROTATE_RIGHT_64(k[i-1],3);
if(m == 4)
tmp = tmp ^ k[i-3];
tmp = tmp ^ ROTATE_RIGHT_64(tmp,1);
k[i] = ~k[i-m] ^ tmp ^ z[i-m] ^ 3;
}
}
void Encrypt64 (uint64_t text[], uint64_t crypt[], uint64_t key[], uint8_t T)
{
uint8_t i;
uint64_t tmp;
crypt[0] = text[0];
crypt[1] = text[1];
// #pragma omp parallel for private(i,tmp)
for (i = 0 ; i<T ; i++)
{
tmp = crypt[0];
crypt[0] = crypt[1] ^ ((ROTATE_LEFT_64(crypt[0],1)) & (ROTATE_LEFT_64(crypt[0],8))) ^ (ROTATE_LEFT_64(crypt[0],2)) ^ key[i];
crypt[1] = tmp;
}
printf("ENC 64:\nPT %lx %lx\nCRYPT %lx %lx\n\n\n", text[0], text[1], crypt[0], crypt[1]);
}
void Decrypt64 (uint64_t text[], uint64_t decrypt[], uint64_t key[], uint8_t T)
{
uint8_t i, sizek;
uint64_t tmp;
decrypt[0] = text[0];
decrypt[1] = text[1];
sizek = T-1;
// #pragma omp parallel for private(i,tmp,T)
for (i = 0 ;i<T ; i++)
{
tmp = decrypt[1];
decrypt[1] = decrypt[0] ^ ((ROTATE_LEFT_64(decrypt[1],1)) & (ROTATE_LEFT_64(decrypt[1],8))) ^ (ROTATE_LEFT_64(decrypt[1],2)) ^ key[sizek-i];
decrypt[0] = tmp;
}
printf("CRIPT %lx %lx\nDECRIPT %lx %lx\n\n\n", text[0], text[1], decrypt[0], decrypt[1]);
}
int main ()
{
//n = tamanho da palavra (se 16 m = 4, se 24 m = 3 ou 4 , se 32 m = 3 ou 4, se 48 m = 2 ou 3 ou se 64 m = 2, 3 ou 4) | m = numero de palavras-chaves
uint8_t m = 4, n = 32, rounds;
uint64_t crypt48[2] = {0};
uint64_t crypt64[2] = {0};
if (m == 2)
rounds = 68;
if (m == 3)
rounds = 69;
if (m == 4)
rounds = 72;
//vetor texto plano
uint64_t text64[2];
//key
uint64_t key64[rounds];
text64[0] = 0x6373656420737265; text64[1] = 0x6c6c657661727420;
key64[3] = 0x131211106c6c657b; key64[2] = 0x348f38a198e547b2; key64[1] = 0x0f0e0d0c0b0a0908; key64[0] = 0x0706050403020100;
//Encryption
KeyExpansion64 (key64,m,rounds);
Encrypt64 (text64,crypt64,key64,rounds);
//Decryption
Decrypt64(crypt64,text64,key64,rounds);
}
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
UUID da partição efi mudou, multiboot já era...e agora? (0)