Last active
December 21, 2015 23:49
-
-
Save jerivas/6385370 to your computer and use it in GitHub Desktop.
Encripta 256 localidades de memoria con rotación y XOR contra un número primo al azar.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*Cifrado de bloques de memoria | |
José Eduardo Rivas Melgar RM100161 | |
David Antonio Escobar Contreras EC100119 | |
Ángel Gerardo Moreno Galán MG070209 | |
Encripta 256 localidades de memoria con rotación y XOR contra un número primo al azar. | |
*/ | |
#include "stdlib.h" | |
#include "stdio.h" | |
#include <p18f4550.h> | |
//Configuracion | |
#pragma config FOSC = INTOSCIO_EC //Oscilador Interno, Puerto A RA6 activo, | |
#pragma config WDT = OFF //Watchdog timer apagado | |
#pragma config PBADEN = OFF //Parte baja del puerto B digitales | |
#pragma config MCLRE = ON //MCLRE Disponible | |
#pragma config DEBUG = ON //Modo de depuracion disponible | |
#pragma config LVP = OFF //Fuente de ISCP apagada | |
void main() { | |
TRISD = 0x0; //Configurar PORTD como salida conectado a LEDs | |
LATD = 0x18; //Indicador de estado "abierto" | |
PORTA = 0x0; //Limpiar PORTA | |
ADCON1 = 0x0F; //Desahabilitar el convertidor A/D | |
CMCON = 0x07; //Deshabilitar el comparador | |
TRISA = 0xFF; //Configurar PORTA como entrada | |
PORTB = 0x0; //Limpiar PORTB | |
TRISB = 0x0F; //Parte baja de PORTB configurada como entrada | |
TMR0ON = 1; //Habilitar TIMER0 | |
T08BIT = 0; //TIMER0 en moodo 8 bits | |
T0CS = 0; //TIMER0 a partir de oscilador interno | |
PSA = 1; //No usar pre-escalador | |
srand(TMR0); //Tomar semilla de TIMER0 | |
const unsigned char primes[] = {101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251}; | |
unsigned char key = primes[rand() % 29]; //Elegir un primo al azar | |
unsigned char mem[256]; //Vector de 256 localidades que guarda los datos a encriptar | |
unsigned char lostbit, firstbit, lastbit = 0; //Variables que guardan los bits que se pierden al rotar | |
//Inicia el proceso de codificación. LEDs muestran el código 0x18 | |
//For externo, se repite cuantas veces lo requiera el primo | |
for (int i=1; i<=key; i++) { | |
firstbit = (mem[0] & 0x80)>>7; //Se guarda el primer bit para el caso especial | |
//For interno, se repite 256 veces para lograr el desplazamiento | |
for (int j=0; j<=255; j++) { | |
lostbit = (mem[j] & 0x80)>>7; //El bit perdido de la posición actual se guarda | |
mem[j] <<= 1; //Desplazamiento a la izquierda de un bit | |
if (j != 0) { //La primera iteración es un caso especial | |
mem[j-1] |= lostbit; //La localidad anterior recibe el bit perdido | |
} | |
} | |
mem[255] |= firstbit; //Resuelve el caso especial de la primera iteración | |
} | |
for (int i=0; i<=255; i++) { | |
mem[i] ^= key; //XOR de todas las localidades | |
} | |
//Fin del proceso de encriptación | |
LATD = key; //Se muestra la clave en PORTD | |
//El nibble más significativo de la clave debe ir a PORTA(0-3) y el menos significativo a PORTB(0-3) | |
while (((PORTA & 0x0F)<<4 | (PORTB & 0x0F)) != key) { //No se hace nada mientras la clave no se introduzca | |
Nop(); | |
} | |
LATD = 0x24; //Código de clave aceptada | |
//Inicio del proceso de decodificación | |
for (int i=0; i<=255; i++) { | |
mem[i] ^= key; //XOR de todas las localidades | |
} | |
for (int i=1; i<=key; i++) { | |
lastbit = (mem[255] & 0x01) << 7; //Se guarda el primer bit para el caso especial | |
//For interno, se repite 256 veces para lograr el desplazamiento | |
for (int j=255; j>=0; j--) { | |
lostbit = (mem[j] & 0x01) << 7; //El bit perdido de la posición actual se guarda | |
mem[j] >>= 1; //Desplazamiento a la derecha de un bit | |
if (j != 255) { //La primera iteración es un caso especial | |
mem[j+1] |= lostbit; //La localidad siguiente recibe el bit perdido | |
} | |
} | |
mem[0] |= lastbit; //Resuelve el caso especial de la primera iteración | |
} | |
//Fin del proceso de desencriptación | |
while(1) { | |
LATD = 0x81; //Código de "memoria desencriptada" | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment