Skip to content

Instantly share code, notes, and snippets.

@jerivas
Created September 6, 2013 00:54
Show Gist options
  • Save jerivas/6458207 to your computer and use it in GitHub Desktop.
Save jerivas/6458207 to your computer and use it in GitHub Desktop.
Encripta 256 localidades de memoria byte por byte.
/*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