Advertisement
rootmese

Archimedes' pump key validator

Jun 27th, 2025
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.16 KB | Cybersecurity | 0 0
  1. /*
  2.  * ordenador_crypt.c - Validador físico baseado em bomba de Arquimedes
  3.  * Inspirado em fluxo natural contínuo com buffer circular
  4.  * Aplicação: validação de chaves com base em ordenação espacial + temporal
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdint.h>
  9. #include <string.h>
  10.  
  11. #define ORDENADOR_SIZE 64
  12. #define TURNS_REQUIRED 3
  13.  
  14. struct packet {
  15.     uint8_t byte_value;
  16. };
  17.  
  18. struct cell {
  19.     struct packet *pkt;
  20.     int age; // número de ciclos que já passou
  21. };
  22.  
  23. static struct cell ordenador[ORDENADOR_SIZE];
  24.  
  25. // Insere dado como "água" na entrada
  26. void inject_data(const uint8_t *data, size_t len) {
  27.     memset(ordenador, 0, sizeof(ordenador));
  28.     for (size_t i = 0; i < len && i < ORDENADOR_SIZE; i++) {
  29.         static struct packet pkts[ORDENADOR_SIZE];
  30.         pkts[i].byte_value = data[i];
  31.         ordenador[i].pkt = &pkts[i];
  32.         ordenador[i].age = 0;
  33.     }
  34. }
  35.  
  36. // Simula o "giro" do parafuso, empurrando dados
  37. void turn_ordenador() {
  38.     for (int i = ORDENADOR_SIZE - 1; i > 0; i--) {
  39.         if (!ordenador[i].pkt && ordenador[i - 1].pkt) {
  40.             ordenador[i].pkt = ordenador[i - 1].pkt;
  41.             ordenador[i].age = ordenador[i - 1].age + 1;
  42.             ordenador[i - 1].pkt = NULL;
  43.         }
  44.     }
  45. }
  46.  
  47. // Valida o buffer após N giros com XOR acumulado
  48. uint8_t compute_checksum() {
  49.     uint8_t checksum = 0;
  50.     for (int i = 0; i < ORDENADOR_SIZE; i++) {
  51.         if (ordenador[i].pkt && ordenador[i].age >= TURNS_REQUIRED) {
  52.             checksum ^= ordenador[i].pkt->byte_value;
  53.         }
  54.     }
  55.     return checksum;
  56. }
  57.  
  58. int main() {
  59.     const uint8_t test_key[] = {0x12, 0x34, 0x56, 0x78};
  60.     inject_data(test_key, sizeof(test_key));
  61.  
  62.     for (int i = 0; i < ORDENADOR_SIZE; i++) {
  63.         turn_ordenador();
  64.     }
  65.  
  66.     uint8_t final = compute_checksum();
  67.     printf("Checksum final da chave: 0x%02X\n", final);
  68.  
  69.     // Validação esperada (exemplo)
  70.     uint8_t expected = 0x12 ^ 0x34 ^ 0x56 ^ 0x78;
  71.     if (final == expected) {
  72.         printf("Chave VÁLIDA - passou pelo fluxo corretamente\n");
  73.     } else {
  74.         printf("Chave INVÁLIDA - fluxo incorreto ou dados adulterados\n");
  75.     }
  76.     return 0;
  77. }
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement