Como gerar randomart de anyfile?

9

Todos conhecemos o randomart ASCII gerado por ssh-keygen ao criar ou validar ssh chaves públicas.

Também sabemos que você pode gerar hashes de qualquer arquivo com sha1sum ou md5sum .

Mas, é possível gerar randomart "ssh-keygen-style" de qualquer arquivo que não seja uma chave ssh pública?

Essa seria uma maneira mais engraçada de comparar visualmente a soma de verificação de dois arquivos.

    
por Tulains Córdova 27.03.2015 / 16:09

2 respostas

8

Você pode gerar arte aleatória de qualquer arquivo com este pequeno programa em C criado pela nirejan :

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

#define XLIM 17
#define YLIM 9
#define ARSZ (XLIM * YLIM)

#define DEBUG 0

static uint16_t array[ARSZ];

const char symbols[] = {
    ' ', '.', 'o', '+',
    '=', '*', 'B', 'O',
    'X', '@', '%', '&',
    '#', '/', '^', 'S', 'E'
};

void print_graph(void)
{
    uint8_t i;
    uint8_t j;
    uint16_t temp;

    printf("+--[ RandomArt ]--+\n");

    for (i = 0; i < YLIM; i++) {
        printf("|");
        for (j = 0; j < XLIM; j++) {
            temp = array[j + XLIM * i];
            printf("%c", symbols[temp]);
        }
        printf("|\n");
    }

    printf("+-----------------+\n");
}

static char string[256];

static int ishex (char c)
{
    if ((c >= '0' && c <= '9') ||
        (c >= 'A' && c <= 'F') ||
        (c >= 'a' && c <= 'f')) {
            return 1;
    }

    return 0;
}

/*
 * The hexval function expects a hexadecimal character in the range
 * [0-9], [A-F] or [a-f]. Passing any other character will result in
 * undefined behaviour. Make sure you validate the character first.
 */
static uint8_t hexval (char c)
{
    if (c <= '9') {
        return (c - '0');
    } else if (c <= 'F') {
        return (c - 'A' + 10);
    } else if (c <= 'f') {
        return (c - 'a' + 10);
    }

    return 0;
}

int convert_string(char *arg)
{
    uint16_t i;
    char c;

    i = 0;
    while (*arg && i < 255) {
        c = *arg;
        if (!ishex(c)) {
            printf("Unrecognized character '%c'\n", c);
            return 1;
        }
        arg++;

        string[i] = hexval(c) << 4;

        if (!*arg) {
            printf("Odd number of characters\n");
            return 1;
        }
        c = *arg;

        if (!ishex(c)) {
            printf("Unrecognized character '%c'\n", c);
            return 1;
        }
        arg++;

        string[i] |= hexval(c);
        i++;
    }

    // Add the terminating null byte
    string[i] = '
./bishop $(sha512sum myfile | cut -f1 -d ' ')
'; return 0; } uint8_t new_position(uint8_t *pos, uint8_t direction) { uint8_t newpos; uint8_t upd = 1; int8_t x0; int8_t y0; int8_t x1; int8_t y1; x0 = *pos % XLIM; y0 = *pos / XLIM; #if DEBUG printf("At position (%2d, %2d)... ", x0, y0); #endif switch (direction) { case 0: // NW #if DEBUG printf("Moving NW... "); #endif x1 = x0 - 1; y1 = y0 - 1; break; case 1: // NE #if DEBUG printf("Moving NE... "); #endif x1 = x0 + 1; y1 = y0 - 1; break; case 2: // SW #if DEBUG printf("Moving SW... "); #endif x1 = x0 - 1; y1 = y0 + 1; break; case 3: // SE #if DEBUG printf("Moving SE... "); #endif x1 = x0 + 1; y1 = y0 + 1; break; default: // Should never happen #if DEBUG printf("INVALID DIRECTION %d!!!", direction); #endif x1 = x0; y1 = y0; break; } // Limit the range of x1 & y1 if (x1 < 0) { x1 = 0; } else if (x1 >= XLIM) { x1 = XLIM - 1; } if (y1 < 0) { y1 = 0; } else if (y1 >= YLIM) { y1 = YLIM - 1; } newpos = y1 * XLIM + x1; #if DEBUG printf("New position (%2d, %2d)... ", x1, y1); #endif if (newpos == *pos) { #if DEBUG printf("NO CHANGE"); #endif upd = 0; } else { *pos = newpos; } #if DEBUG printf("\n"); #endif return upd; } void drunken_walk(void) { uint8_t pos; uint8_t upd; uint16_t idx; uint8_t i; uint8_t temp; pos = 76; for (idx = 0; string[idx]; idx++) { temp = string[idx]; #if DEBUG printf("Walking character index %d ('%02x')...\n", idx, temp); #endif for (i = 0; i < 4; i++) { upd = new_position(&pos, temp & 3); if (upd) { array[pos]++; } temp >>= 2; } } array[pos] = 16; // End array[76] = 15; // Start } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: bishop <hex string>\n"); return 1; } if (convert_string(argv[1])) { printf("String conversion failed!\n"); return 1; } drunken_walk(); print_graph(); return 0; }

Para usá-lo, siga estas etapas:

  1. Coloque o código-fonte em um arquivo:
    • Abra o gedit ou seu editor de texto favorito.
    • Cole o código-fonte acima.
    • Salve como bishop.c .
  2. Compile o código executando gcc bishop.c -o bishop .
  3. Veja a arte aleatória de qualquer arquivo (onde myfile é o arquivo):

    sudo mkdir -p /usr/local/bin
    
  4. Crie um script personalizado para visualizar a arte aleatória de qualquer arquivo:

    • Crie a pasta de binários locais, se não existir:

      sudo touch /usr/local/bin/randomart
      
    • Crie um arquivo nessa pasta com o script:

      sudo chmod 777 /usr/local/bin/randomart
      
    • Conceder permissões ao arquivo:

      #!/bin/bash
      
      bishop $(sha512sum "$@" | cut -f1 -d ' ')
      
    • Execute gedit /usr/local/bin/randomart para editar o arquivo e cole isso nele:

      sudo cp bishop /usr/local/bin/
      
    • Salve o arquivo.

    • Copie o programa que criamos na etapa anterior para a pasta binários local:

      sudo chmod a+x /usr/local/bin/bishop
      
    • Conceder permissão de execução ao binário:

      #include <stdio.h>
      #include <stdint.h>
      #include <stdlib.h>
      
      #define XLIM 17
      #define YLIM 9
      #define ARSZ (XLIM * YLIM)
      
      #define DEBUG 0
      
      static uint16_t array[ARSZ];
      
      const char symbols[] = {
          ' ', '.', 'o', '+',
          '=', '*', 'B', 'O',
          'X', '@', '%', '&',
          '#', '/', '^', 'S', 'E'
      };
      
      void print_graph(void)
      {
          uint8_t i;
          uint8_t j;
          uint16_t temp;
      
          printf("+--[ RandomArt ]--+\n");
      
          for (i = 0; i < YLIM; i++) {
              printf("|");
              for (j = 0; j < XLIM; j++) {
                  temp = array[j + XLIM * i];
                  printf("%c", symbols[temp]);
              }
              printf("|\n");
          }
      
          printf("+-----------------+\n");
      }
      
      static char string[256];
      
      static int ishex (char c)
      {
          if ((c >= '0' && c <= '9') ||
              (c >= 'A' && c <= 'F') ||
              (c >= 'a' && c <= 'f')) {
                  return 1;
          }
      
          return 0;
      }
      
      /*
       * The hexval function expects a hexadecimal character in the range
       * [0-9], [A-F] or [a-f]. Passing any other character will result in
       * undefined behaviour. Make sure you validate the character first.
       */
      static uint8_t hexval (char c)
      {
          if (c <= '9') {
              return (c - '0');
          } else if (c <= 'F') {
              return (c - 'A' + 10);
          } else if (c <= 'f') {
              return (c - 'a' + 10);
          }
      
          return 0;
      }
      
      int convert_string(char *arg)
      {
          uint16_t i;
          char c;
      
          i = 0;
          while (*arg && i < 255) {
              c = *arg;
              if (!ishex(c)) {
                  printf("Unrecognized character '%c'\n", c);
                  return 1;
              }
              arg++;
      
              string[i] = hexval(c) << 4;
      
              if (!*arg) {
                  printf("Odd number of characters\n");
                  return 1;
              }
              c = *arg;
      
              if (!ishex(c)) {
                  printf("Unrecognized character '%c'\n", c);
                  return 1;
              }
              arg++;
      
              string[i] |= hexval(c);
              i++;
          }
      
          // Add the terminating null byte
          string[i] = '
      ./bishop $(sha512sum myfile | cut -f1 -d ' ')
      
      '; return 0; } uint8_t new_position(uint8_t *pos, uint8_t direction) { uint8_t newpos; uint8_t upd = 1; int8_t x0; int8_t y0; int8_t x1; int8_t y1; x0 = *pos % XLIM; y0 = *pos / XLIM; #if DEBUG printf("At position (%2d, %2d)... ", x0, y0); #endif switch (direction) { case 0: // NW #if DEBUG printf("Moving NW... "); #endif x1 = x0 - 1; y1 = y0 - 1; break; case 1: // NE #if DEBUG printf("Moving NE... "); #endif x1 = x0 + 1; y1 = y0 - 1; break; case 2: // SW #if DEBUG printf("Moving SW... "); #endif x1 = x0 - 1; y1 = y0 + 1; break; case 3: // SE #if DEBUG printf("Moving SE... "); #endif x1 = x0 + 1; y1 = y0 + 1; break; default: // Should never happen #if DEBUG printf("INVALID DIRECTION %d!!!", direction); #endif x1 = x0; y1 = y0; break; } // Limit the range of x1 & y1 if (x1 < 0) { x1 = 0; } else if (x1 >= XLIM) { x1 = XLIM - 1; } if (y1 < 0) { y1 = 0; } else if (y1 >= YLIM) { y1 = YLIM - 1; } newpos = y1 * XLIM + x1; #if DEBUG printf("New position (%2d, %2d)... ", x1, y1); #endif if (newpos == *pos) { #if DEBUG printf("NO CHANGE"); #endif upd = 0; } else { *pos = newpos; } #if DEBUG printf("\n"); #endif return upd; } void drunken_walk(void) { uint8_t pos; uint8_t upd; uint16_t idx; uint8_t i; uint8_t temp; pos = 76; for (idx = 0; string[idx]; idx++) { temp = string[idx]; #if DEBUG printf("Walking character index %d ('%02x')...\n", idx, temp); #endif for (i = 0; i < 4; i++) { upd = new_position(&pos, temp & 3); if (upd) { array[pos]++; } temp >>= 2; } } array[pos] = 16; // End array[76] = 15; // Start } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: bishop <hex string>\n"); return 1; } if (convert_string(argv[1])) { printf("String conversion failed!\n"); return 1; } drunken_walk(); print_graph(); return 0; }
  5. Use o programa recém-criado executando randomart myfile , em que myfile é o arquivo.

por Helio 31.05.2015 / 23:02

Tags