Linux base64摘要-输入无效?
这里有以下数据,我必须使用openssl查找sha1摘要 数据: 给我的摘要是: WK2PJNOREHSELMW4TMX+rjHsQQ= 但当我使用(f1=复制上述数据的文件)时: base64-df1.txt | openssl dgst-sha1-binary | base64 我得到一个“base64:invalid input”错误,下面的摘要看起来完全不同:( BaRlDid73RYBFMgqveC8G+gFBBU= 有人能确认并解释一下是否有错误吗 更新:Linux base64摘要-输入无效?,linux,openssl,Linux,Openssl,这里有以下数据,我必须使用openssl查找sha1摘要 数据: 给我的摘要是: WK2PJNOREHSELMW4TMX+rjHsQQ= 但当我使用(f1=复制上述数据的文件)时: base64-df1.txt | openssl dgst-sha1-binary | base64 我得到一个“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);
}
//RCVBUFSIZE=1024(已定义)
无效HandleClient(int clntSocket)
{
char echoBuffer[RCVBUFSIZE];/*用于回显字符串的缓冲区*/
memset(echoBuffer,0,RCVBUFSIZE);
char inBuffer;/*第一个字符串的缓冲区*/
字符记录数据;
int recvMsgSize=0;/*接收消息的大小*/
char-replyBuffer[32];
接收到的int字节=0;
int-rv=0;
int connected=clntSocket;
int len=0;
int i=0;
执行副总裁MD CTX MD CTX;
工程执行副总裁(总经理)总经理(总经理);;
无符号字符md_值[EVP_MAX_md_SIZE];
无符号整数md_len;
OpenSSL_添加_所有_摘要();
md=EVP_get_digestbyname(“sha1”);
EVP_MD_CTX_init(&MD_CTX);
EVP_DigestInit_ex(&md_ctx,md,NULL);
/*从客户端接收消息*/
而(((bytes_received=recv(connected,&inBuffer,1,0))>0)和(&inBuffer!='\n')){
/*发送接收到的字符串并再次接收,直到传输结束*/
如果(接收的字节数>0)/*0表示传输结束*/
{
printf(“从客户端收到的消息是:%c\n”,inBuffer);
char n=inBuffer;
int指标=0;
int电流=0;
无符号长文件;
如果(n=='6'){
如果((recvMsgSize=recv(已连接,echoBuffer,RCVBUFSIZE,0))<0)
DIEWERROR(“recv()失败”);
printf(“获取的字节数:%d\n”,recvMsgSize);
如果(recvMsgSize>0)
echoBuffer[recvMsgSize]='\0';
len=atoi(回声缓冲区);
char*data=NULL;
printf(“以下消息的长度:%d\n”,len);
如果(len>0){
对于(i=RCVBUFSIZE;i<(len+RCVBUFSIZE);i=i+RCVBUFSIZE){
如果(i>len)
recvMsgSize=recv(已连接,echoBuffer,(len-(i-RCVBUFSIZE)),0);
其他的
recvMsgSize=recv(已连接,echoBuffer,RCVBUFSIZE,0);
echoBuffer[recvMsgSize]='\0';
解码(echoBuffer、recvMsgSize、“文件输出”);
数据=readFileBuffer(“文件输出”);
EVP_DigestUpdate(&md_ctx,数据,strlen(数据));
}
}
len=0;
memset(echoBuffer,0,RCVBUFSIZE);
recvMsgSize=0;
}
如果(n='5'){
printf(“更新摘要-计算最终Dgst!!!\n”);
n=0;
EVP_DigestFinal_ex(&md_ctx,md_value,&md_len);//将摘要从ctx检索到md_value,并将写入的#字节复制到md_len
EVP_MD_CTX_清理(&MD_CTX);
文件*f;
f=fopen(“文件1”,“w”);
printf(“\n”);
printf(“***************************************************************************************\n”);
printf(“摘要是:”);
对于(i=0;i0)
{
printf(“readbytes:%d\n”,readbytes);
BIO_写入(fileWrBIO、msg、readbytes);
BIO_冲洗(fileWrBIO);
memset(msg,0x00,sizeof(msg));
}
免费(味精);
BIO_free_all(BIO);
BIO_free_all(fileWrBIO);
}
嗯,数据似乎不是有效的base64字符串。您可能缺少一些字符。您的数据无效,可能是部分数据。有效的base64编码字符串的长度应为4的倍数。因此,不同的摘要
//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);
}
# base64 ssh_host_rsa_key | base64 -d
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA7qHASF1Jgbase64: invalid input
tar -cf - /home/backup | gzip | base64 -w 0
base64 -d -i | gunzip | tar -xvf - -C /
base64 -w 0 < id_rsa