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);
}
Atualizando o Passado: Linux no Lenovo G460 em 2025
aaPanel - Um Painel de Hospedagem Gratuito e Poderoso
O macete do Warsaw no Linux Mint e cia
Um modo leve de ouvir/ver áudio/vídeo da internet em máquinas pererecas
Resolver algumas mensagens de erro do SSH
Instalar módulo de segurança do Banco do Brasil Warsaw do tipo .run
Sem espaço na partição home (2)
O que você está ouvindo agora? [2] (190)
Procrastinação e autossabotagem são problemas muito comuns na sociedad... (5)
warsaw parou de funcionar após atualização do sistema (solução) (10)