কীভাবে কোনও ফাইলের র্যান্ডোমার্ট তৈরি করবেন?


9

পাবলিক কীগুলি ssh-keygenতৈরি বা যাচাই করার সময় আমরা সকলেই ASCII র্যান্ডোমার্ট জেনারেট করি ssh

আমরা এও জানি যে আপনি sha1sumবা এর সাথে যে কোনও ফাইলের হ্যাশ তৈরি করতে পারেন md5sum

তবে, পাবলিক এসএস কী নয় এমন কোনও ফাইল থেকে র্যান্ডোমার্ট "ssh-keygen-style" উত্পন্ন করা কি সম্ভব ?

এটি দুটি ফাইলের চেকসামকে চাক্ষুষভাবে তুলনা করার একটি মজার উপায় way

উত্তর:


8

আপনি নীরেজন দ্বারা নির্মিত এই ছোট সি প্রোগ্রামের মাধ্যমে যে কোনও ফাইলের এলোমেলো শিল্প তৈরি করতে পারেন :

#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] = '\0';
    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;
}

এটি ব্যবহার করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. উত্স কোডটি একটি ফাইলে রাখুন:
    • জিডিট বা আপনার প্রিয় পাঠ্য সম্পাদক খুলুন।
    • উপরের উত্স কোডটি আটকান।
    • এটি হিসাবে সংরক্ষণ করুন bishop.c
  2. চলমান কোডটি কম্পাইল করুন gcc bishop.c -o bishop
  3. যে কোনও ফাইলের র্যান্ডম আর্ট দেখুন (ফাইলটি কোথায় myfile):

    ./bishop $(sha512sum myfile | cut -f1 -d ' ')
    
  4. যে কোনও ফাইলের এলোমেলো শিল্প দেখতে একটি কাস্টম স্ক্রিপ্ট তৈরি করুন:

    • উপস্থিত না থাকলে স্থানীয় বাইনারি ফোল্ডারটি তৈরি করুন:

      sudo mkdir -p /usr/local/bin
      
    • স্ক্রিপ্টটি দিয়ে সেই ফোল্ডারে একটি ফাইল তৈরি করুন:

      sudo touch /usr/local/bin/randomart
      
    • ফাইলটিতে অনুমতি দিন:

      sudo chmod 777 /usr/local/bin/randomart
      
    • gedit /usr/local/bin/randomartফাইল সম্পাদনা করতে এটি চালান এবং এটিতে এটি আটকে দিন:

      #!/bin/bash
      
      bishop $(sha512sum "$@" | cut -f1 -d ' ')
      
    • ফাইলটি সংরক্ষণ করুন।

    • আমরা স্থানীয় বাইনারি ফোল্ডারে আগের ধাপে যে প্রোগ্রামটি তৈরি করেছি তা অনুলিপি করুন:

      sudo cp bishop /usr/local/bin/
      
    • বাইনারি চালানোর অনুমতি দিন:

      sudo chmod a+x /usr/local/bin/bishop
      
  5. ফাইলটি randomart myfileযেখানে myfileরয়েছে সেখানে সদ্য তৈরি হওয়া প্রোগ্রামটি ব্যবহার করুন।


1
খুব চিত্তাকর্ষক
এবি

2

আমি যে কোনও ফাইলের এমডি 5 চেকসাম তৈরি করতে পারি যা পাবলিক এসএস কী নয়, বলুন, একটি জেপিজি ফাইল। আমি কীভাবে এমডি 5 এর র্যান্ডোমার্ট পেতে পারি?
Tulains Cordordova

+10: আপনি আমাকে সূচনা পয়েন্ট দিয়েছেন। ;-)
হেলিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.