base64 digest- невалиден вход?

Тук имам следните данни, за които трябва да намеря дайджеста sha1 с помощта на openssl.

данни:

AwAIAOwIAAABABwAgAIAABYAAAAAAAAAAAAAAHQAAAAAAAAAAAAAAAgAAAAkAAAAQgAAAFQAAABsAAAAhgAAAJgAAACuAAAAwgAAAM4AAADsAAAAAgEAAAwBAAAoAQAARgEAAFgBAACwAQAAtAEAANABAADkAQAA+gEAAAIAaQBkAAAADABsAGEAeQBvAHUAdABfAHcAaQBkAHQAaAAAAA0AbABhAHkAbwB1AHQAXwBoAGUAaQBnAGgAdAAAAAcAZwByAGEAdgBpAHQAeQAAAAoAYgBhAGMAawBnAHIAbwB1AG4AZAAAAAsAbwByAGkAZQBuAHQAYQB0AGkAbwBuAAAABwBwAGEAZABkAGkAbgBnAAAACQB0AGUAeAB0AEMAbwBsAG8AcgAAAAgAdABlAHgAdABTAGkAegBlAAAABAB0AGUAeAB0AAAADQBwAGEAZABkAGkAbgBnAEIAbwB0AHQAbwBtAAAACQBzAGMAYQBsAGUAVAB5AHAAZQAAAAMAcwByAGMAAAAMAHAAYQBkAGQAaQBuAGcAUgBpAGcAaAB0AAAADQBsAGEAeQBvAHUAdABfAHcAZQBpAGcAaAB0AAAABwBhAG4AZAByAG8AaQBkAAAAKgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBhAG4AZAByAG8AaQBkAC4AYwBvAG0ALwBhAHAAawAvAHIAZQBzAC8AYQBuAGQAcgBvAGkAZAAAAAAAAAAMAEwAaQBuAGUAYQByAEwAYQB5AG8AdQB0AAAACABUAGUAeAB0AFYAaQBlAHcAAAAJAEkAbQBhAGcAZQBWAGkAZQB3AAAABgBCAHUAdAB0AG8AbgAAAAAAgAEIAEQAAADQAAEB9AABAfUAAQGvAAEB1AABAcQAAQHVAAEBmAABAZUAAQFPAQEB2QABAR0BAQEZAQEB2AABAYEBAQEAARAAGAAAABEAAAD/////DwAAABAAAAACARAAsAAAABEAAAD//////////xIAAAAUABQABwAAAAAAAAAQAAAAAwAAAP////8IAAAREQAAABAAAAAFAAAA/////wgAABABAAAAEAAAAAAAAAD/////CAAAAR0AB38QAAAABAAAAP////8IAAABEQAGfxAAAAAGAAAA/////wgAAAUBEAAAEAAAAAEAAAD/////CAAAEP////8QAAAAAgAAAP////8IAAAQ/////wIBEACcAAAAGgAAAP//////////EwAAABQAFAAGAAAAAAAAABAAAAAIAAAA/////wgAAAUCEgAAEAAAAAcAAAD/////CAAAARAABn8QAAAACgAAAP////8IAAAFARgAABAAAAABAAAA/////wgAABD/////EAAAAAIAAAD/////CAAAEP7///8QAAAACQAAAP////8IAAABRwAIfwMBEAAYAAAAIAAAAP//////////EwAAAAIBEAB0AAAAIgAAAP//////////EgAAABQAFAAEAAAAAAAAABAAAAAFAAAA/////wgAABAAAAAAEAAAAAQAAAD/////CAAAAREABn8QAAAAAQAAAP////8IAAAQ/////xAAAAACAAAA/////wgAABD+////AgEQAIgAAAAoAAAA//////////8UAAAAFAAUAAUAAAAAAAAAEAAAAA0AAAD/////CAAABQEYAAAQAAAAAQAAAP////8IAAAQ/v///xAAAAACAAAA/////wgAABD+////EAAAAAwAAAD/////CAAAAQEAAn8QAAAACwAAAP////8IAAAQBQAAAAMBEAAYAAAALQAAAP//////////FAAAAAIBEAB0AAAALwAAAP//////////EgAAABQAFAAEAAAAAAAAABAAAAAFAAAA/////wgAABABAAAAEAAAAAEAAAD/////CAAABQEAAAAQAAAAAgAAAP////8IAAAQ/v///xAAAAAOAAAA/////wgAAAQAAIA/AgEQAHQAAAA1AAAA//////////8VAAAAFAAUAAQAAAAAAAAAEAAAAAAAAAD/////CAAAASgAB38QAAAAAQAAAP////8IAAAQ/////xAAAAACAAAA/////wgAABD+////EAAAAAkAAAD/////CAAAARUACH8DARAAGAAAADgAAAD//////////xUAAAACARAAdAAAADoAAAD//////////xUAAAAUABQABAAAAAAAAAAQAAAAAAAAAP////8IAAABKgAHfxAAAAABAAAA/////wgAABD/////EAAAAAIAAAD/////CAAAEP7///8QAAAACQAAAP////8IAAABGgAIfwMBEAAYAAAAPQAAAP//////////FQAAAAMBEAAYAAAAPwAAAP//////////EgAAAAIBEAB0AAAAQQAAAP//////////EgAAABQAFAAEAAAAAAAAABAAAAAFAAAA/////wgAABABAAAAEAAAAAEAAAD/////CAAABQEAAAAQAAAAAgAAAP////8IAAAQ/v///xAAAAAOAAAA/////wgAAAQAAIA/AgEQAHQAAABHAAAA//////////8VAAAAFAAUAAQAAAAAAAAAEAAAAAAAAAD/////CAAAASkAB38QAAAAAQAAAP////8IAAAQ/////xAAAAACAAAA/////wgAABD+////EAAAAAkAAAD/////CAAAARYACH8DARAAGAAAAEoAAAD//////////xUAAAACARAAdAAAAEwAAAD//////////xUAAAAUABQABAAAAAAAAAAQAAAAAAAAAP////8IAAABKwAHfxAAAAABAAAA/////wgAABD/////EAAAAAIAAAD/////CAAAEP7///8QAAAACQAAAP////8IAAABGQAIfwMBEAAYAAAATwAAAP//////////FQAAAAMBEAAYAAAAUQAAAP//////////EgAAAAMBEAAYAAAAUwAAAP//////////EgAAAAMBEAAYAAAAVQAAAP//////////EgAAAAEBEAAYAAAAVQAAAP////8PAAAAEAAAABgAAAA9AAAA//////////8fAAAAAgEQAGAAAAA/AAAA//////////8eAAAAFAAUAAMAAAAAAAAAGQAAAAUAAAD/////CAAAEAAAAAAZAAAAAAAAAP////8IAAAQ/v///xkAAAABAAAA/////wgAABD+////AgEQAMQAAABEAAAA//////////8gAAAAFAAUAAgAAAAAAAAAGQAAABIAAAD/////CAAABQIOAAAZAAAAEQAAAP////8IAAARAQAAABkAAAAQAAAA/////wgAAAEGAAZ/GQAAAAIAAAD/////CAAAARIAB38ZAAAAEwAAAP////8IAAAFAQQAABkAAAAAAAAA/////wgAABD+////GQAAAAEAAAD/////CAAAEP7///8ZAAAADwAAAP////8IAAABMwAIfwMBEAAYAAAASwAAAP//////////IAAAAAIBEACIAAAATQAAAP//////////IAAAABQAFAAFAAAAAAAAABkAAAASAAAA/////wgAAAUCDgAAGQAAABAAAAD/////CAAAAQYABn8ZAAAAAgAAAP////8IAAABEwAHfxkAAAAAAAAA/////wgAABD+////GQAAAAEAAAD/////CAAAEP7///8DARAAGAAAAFEAAAD//////////yAAAAADARAAGAAAAFMAAAD//////////x4AAAACARAAYAAAAFUAAAD//////////x4AAAAUABQAAwAAAAAAAAAZAAAABQAAAP////8IAAAQAAAAABkAAAAAAAAA/////wgAABD+////GQAAAAEAAAD/////CAAAEP7///8CARAAxAAAAFoAAAD//////////yAAAAAUABQACAAAAAAAAAAZAAAAEgAAAP////8IAAAFAg4AABkAAAARAAAA/////wgAABEBAAAAGQAAABAAAAD/////CAAAAQYABn8ZAAAAAgAAAP////8IAAABFAAHfxkAAAATAAAA/////wgAAA

Дайджестът, който ми беше даден, е: Wk2pJnOErEHsElMw4TMX+rjHsQQ=

Но когато използвам (f1= файл, където копирах горните данни):

base64 -d f1.txt | openssl dgst -sha1 -binary | база64

Получавам грешка „base64: invalid input“ и следния дайджест, който изглежда напълно различен :(

BaRlDid73RYBFMgqveC8G+gFBBU=

Може ли някой да потвърди и обясни дали има някаква грешка??

АКТУАЛИЗИРАНО:

Сценарий: Двоичният файл на клиента е кодиран base64 и изпратен до сървъра. Сървърът декодира това и изчислява дайджеста sha1. Тъй като имам base64 кодиран sha1 дайджест на клиента, сървърът също кодира дайджеста към base64. Сега тези две трябва да съвпадат. И не става! Получавам всички данни. Проверих го отново. Ще представя част от кода тук:

//RCVBUFSIZE = 1024 (defined)
void HandleClient(int clntSocket)
{
char echoBuffer[RCVBUFSIZE] ;        /* Buffer for echo string */
    memset(echoBuffer, 0, RCVBUFSIZE);
    char inBuffer;        /* Buffer for first string */
    char recv_data;
    int recvMsgSize = 0;                    /* Size of received message */
    char replyBuffer[32];
    int bytes_received = 0;
    int rv = 0;
    int connected = clntSocket;
    int len= 0;
    int i = 0;
     EVP_MD_CTX md_ctx;
     const EVP_MD *md;
     unsigned char md_value[EVP_MAX_MD_SIZE];
     unsigned int md_len;
     OpenSSL_add_all_digests();
     md = EVP_get_digestbyname("sha1");
     EVP_MD_CTX_init(&md_ctx);
     EVP_DigestInit_ex(&md_ctx, md, NULL);

    /* Receive message from client */
    while (((bytes_received = recv(connected,&inBuffer,1,0)) > 0) && (inBuffer != '\n')){

    /* Send received string and receive again until end of transmission */
    if (bytes_received  > 0)      /* zero indicates end of transmission */
    {
    printf("Message received from Client is : %c\n", inBuffer);
    char n = inBuffer;
    int indicator =  0;
    int current = 0;
    unsigned long fileLen;

    if(n =='6'){
        if ((recvMsgSize = recv(connected, echoBuffer, RCVBUFSIZE, 0)) < 0)
        DieWithError("recv() failed");
        printf("no. of bytes got : %d\n", recvMsgSize);
        if (recvMsgSize > 0)
        echoBuffer[recvMsgSize] = '\0';
        len= atoi(echoBuffer);
        char *data =NULL;
        printf("length of following message : %d\n", len);
        if(len>0){
    for( i = RCVBUFSIZE; i < (len+RCVBUFSIZE); i=i+RCVBUFSIZE){
                if(i>len)
                recvMsgSize = recv(connected, echoBuffer, (len - (i-RCVBUFSIZE)), 0);
                else
                recvMsgSize = recv(connected, echoBuffer, RCVBUFSIZE, 0);               
                echoBuffer[recvMsgSize] = '\0';
                decode(echoBuffer, recvMsgSize, "file_out");
                data = readFileBuffer("file_out");
                EVP_DigestUpdate(&md_ctx, data, strlen(data));
            }
        }
        len = 0;
        memset(echoBuffer, 0, RCVBUFSIZE);
        recvMsgSize = 0;

    }


    if (n =='5'){
            printf("Update Digest Over- Calculate Final Dgst!!!!! \n");
            n= 0;

            EVP_DigestFinal_ex(&md_ctx, md_value, &md_len); //retrieve digest from ctx unto md_value and #bytes written is copied into   md_len
            EVP_MD_CTX_cleanup(&md_ctx);
            FILE *f;
             f = fopen("file_sha1", "w");
            printf("\n");
            printf("******************************************************\n ");
            printf("Digest is: ");
            for(i = 0; i < md_len; i++){
                if ( f !=NULL){
                    fputc(md_value[i], f);
                    }
            printf("%02x", md_value[i]);
            }
            printf("\n");
            printf("******************************************************\n ");
            fclose(f);
    }
printf("socket closing\n");
    close(connected);    /* Close client socket */
}
}

char *readFileBuffer(char *name)
{
    FILE *file;
    char *buffer = NULL;
    unsigned long fileLen;
    //Open file
    file = fopen(name, "rb");
    if (!file)
    {
        fprintf(stderr, "Unable to open file %s", name);
        return;
    }
    //Get file length
    fseek(file, 0, SEEK_END);
    fileLen=ftell(file);
    printf("file length  = %ld\n", fileLen);
    fseek(file, 0, SEEK_SET);

    //printf("Allocate memory\n");
    buffer=(char *)malloc(fileLen+1);
    printf("length of write buffer = %d\n", strlen(buffer));
    if (!buffer)
    {
        fprintf(stderr, "Memory error!");

    }

    long int n = fread(buffer,1, fileLen,file);
    buffer[n] = '\0';
    printf("Read no. of bytes = %ld into buffer \n", n);
    printf("len of buffer  %d  \n", strlen(buffer));
    if (!buffer)
    {
        fprintf(stderr, "Memory error!");
        fclose(file);
    }
    fclose(file);
    //free(name);
    return buffer;

}

// reads b64 encoded msg (ReadBuffer) and writes to WriiteFile.
void decode(char *ReadBuffer, int Length, char *WriteFile)
{
    char *msg = (char *)malloc(Length);
    memset(msg, 0x00, Length);
    int readbytes = -1;

    printf("buffer write file %s\n", WriteFile);

    // the decode msg is written to this bio
    BIO *fileWrBIO = BIO_new_file(WriteFile, "w");

    BIO *b64 = BIO_new(BIO_f_base64());
    BIO *bio = BIO_new_mem_buf(ReadBuffer, Length);
    bio = BIO_push(b64, bio);
    BIO_set_flags(bio,BIO_FLAGS_BASE64_NO_NL);

    while ((readbytes = BIO_read(bio, msg, Length)) > 0)
    {
    printf("readbytes:  %d\n", readbytes);
       BIO_write(fileWrBIO, msg, readbytes);
       BIO_flush(fileWrBIO);
       memset(msg, 0x00, sizeof(msg));
    }
    free(msg);
    BIO_free_all(bio);
    BIO_free_all(fileWrBIO);
}

person pimmling    schedule 21.02.2011    source източник


Отговори (5)


Вашите данни са невалидни, вероятно частични. Валиден низ, кодиран с base64, трябва да има дължина, кратна на 4. Така че се очаква различен резултат от дайджеста.

person forcefsck    schedule 21.02.2011

FWIW...

Има реализации, при които base64 не може да прочете собствения си изход.

# base64 ssh_host_rsa_key | base64 -d 
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA7qHASF1Jgbase64: invalid input

Това е на машина с CentOS 5.

Причината е, че base64 произвежда изход с прекъсвания на редове, които са символи за боклук за декодера.

Решението е или да създадете base64 без прекъсвания на редове (-w 0), или да накарате декодера да игнорира ненужните знаци (-i).

person detue    schedule 06.03.2012

Е, данните изглежда не са валиден base64 низ. Може да пропускате някои знаци.

person Šimon Tóth    schedule 21.02.2011
comment
Сценарий: Двоичният файл на клиента е кодиран base64 и изпратен до сървъра. Сървърът декодира това и изчислява дайджеста sha1. Тъй като имам base64 кодиран sha1 дайджест на клиента, сървърът също кодира дайджеста към base64. Сега тези две трябва да съвпадат. И не става! Получавам всички данни. Проверих го отново. Ще представя кода - person pimmling; 23.02.2011
comment
Е, не го правиш. Този низ не е валиден base64 кодиран низ :-D - person Šimon Tóth; 23.02.2011
comment
Да, прав си :) Бях изпратил грешни данни преди.. Но сега кодирах всичко това и проверих. Моля, разгледайте. - person pimmling; 23.02.2011

Просто натиснете това, също и на CentOS 5. И -w 0, и -i бяха необходими, -i не работеше сам. напр.:

 tar -cf - /home/backup | gzip | base64 -w 0
 base64 -d -i | gunzip | tar -xvf - -C /

работи добре за преместване на малка домашна директория чрез копиране и поставяне.

person Bill McGonigle    schedule 10.10.2012

Можете да шифровате с тази команда

base64 -w 0 < id_rsa
person Rafael Corrêa Gomes    schedule 16.04.2020