Linux base64 摘要-无效输入?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5066800/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 02:57:22  来源:igfitidea点击:

base64 digest- invalid input?

linuxopenssl

提问by pimmling

I have here the following data for which I have to find the sha1 digest using openssl.

我在这里有以下数据,我必须使用 openssl 找到 sha1 摘要。

data:

数据:

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

The digest as given to me is: Wk2pJnOErEHsElMw4TMX+rjHsQQ=

给我的摘要是:Wk2pJnOErEHsElMw4TMX + rjHsQQ =

But when I use(f1= file where I copied the above data):

但是当我使用 (f1 = 我复制上述数据的文件) 时:

base64 -d f1.txt | openssl dgst -sha1 -binary | base64

base64 -d f1.txt | openssl dgst -sha1 -binary | base64

I get a "base64: invalid input" error and the following digest which seems completely different :(

我收到“base64:无效输入”错误和以下似乎完全不同的摘要:(

BaRlDid73RYBFMgqveC8G+gFBBU=

BaRlDid73RYBFMgqveC8G + gFBBU =

Can somebody confirm and explain if there is some mistake??

有人可以确认并解释是否有错误吗?

UPDATED:

更新:

Scenario: Client's binary file is base64 encoded and sent to server. Server decodes this and computes the sha1 digest. Since I have client's base64 encoded sha1 digest, the server also encodes the digest to base64. Now these two should match. And it doesn't! I receive all data. I have rechecked it. I shall present part of the code here:

场景:客户端的二进制文件是 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] = '
# base64 ssh_host_rsa_key | base64 -d 
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA7qHASF1Jgbase64: invalid input
'; 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] = '
 tar -cf - /home/backup | gzip | base64 -w 0
 base64 -d -i | gunzip | tar -xvf - -C /
'; 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] = '
base64 -w 0 < id_rsa
'; 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); }

采纳答案by forcefsck

Your data is invalid, probably partial. A valid base64 encoded string should have a length multiple of 4. So the different digest output is expected.

您的数据无效,可能是部分数据。一个有效的 base64 编码字符串的长度应该是 4 的倍数。所以不同的摘要输出是可以预期的。

回答by ?imon Tóth

Well, the data doesn't seem to be a valid base64 string. You might be missing some characters.

好吧,数据似乎不是有效的 base64 字符串。您可能会遗漏一些字符。

回答by detue

FWIW...

FWIW...

There are implementations where base64 cannot read its own output.

在某些实现中,base64 无法读取自己的输出。

##代码##

This is on a CentOS 5 machine.

这是在 CentOS 5 机器上。

Reason is that base64 produces output with line breaks, which are garbage chars for the decoder.

原因是 base64 产生带有换行符的输出,这是解码器的垃圾字符。

Solution is to either produce the base64 without linebreaks (-w 0) or make the decoder ignore garbage chars (-i).

解决方案是生成不带换行符的 base64 (-w 0) 或让解码器忽略垃圾字符 (-i)。

回答by Bill McGonigle

Just hit this, also on CentOS 5. Both -w 0and -iwere required, -ididn't work alone. e.g.:

只要按下此,也在CentOS 5都-w 0-i被要求,-i没有单独工作。例如:

##代码##

worked fine to move a small home directory via copy&paste.

通过复制和粘贴移动一个小的主目录工作正常。

回答by Rafael Corrêa Gomes

You can encrypt using this command

您可以使用此命令进行加密

##代码##