Created
September 6, 2013 00:54
-
-
Save jerivas/6458207 to your computer and use it in GitHub Desktop.
Encripta 256 localidades de memoria byte por byte.
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 | |
Carlos Ernesto Linares Zelada ZR090636 | |
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; //Configurar la parte baja de PORTB 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 lostbyte = 0; //Variables que guardan los bits que se pierden al rotar | |
//For externo, se repite cuantas veces lo requiera el primo | |
for (int i=1; i<=key; i++) { | |
lostbyte = mem[0]; //Se guarda el primer byte para el caso especial | |
//For interno, se repite 256 veces para lograr el desplazamiento | |
for (int j=1; j<=255; j++) { | |
mem[j-1] = mem[j]; | |
} | |
mem[255] = lostbyte; //Resuelve el caso especial de la primera iteración | |
} | |
for (int i=0; i<=255; i++) { | |
mem[i] ^= key; //XOR de todas las localidades | |
} | |
LATD = key; //Se muestra la clave en PORTD | |
while (((PORTA & 0x0F)<<4 | (PORTB & 0x0F)) != key) { //No se hace nada mientras la clave no se introduzca | |
Nop(); | |
} | |
LATD = 0x24; //Codigo de "clave aceptada" | |
for (int i=0; i<=255; i++) { | |
mem[i] ^= key; //XOR de todas las localidades | |
} | |
for (int i=1; i<=key; i++) { | |
lostbyte = mem[255]; //Se guarda el primer bit para el caso especial | |
//For interno, se repite 256 veces para lograr el desplazamiento | |
for (int j=254; j>=0; j--) { | |
mem[j+1] = mem[j]; //La localidad siguiente recibe el bit perdido | |
} | |
mem[0] = lostbyte; //Resuelve el caso especial de la primera iteració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