Skip to content

Instantly share code, notes, and snippets.

@jerivas
Last active December 21, 2015 23:49
Show Gist options
  • Save jerivas/6385370 to your computer and use it in GitHub Desktop.
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.
/*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