當前位置:首頁 » 密碼管理 » base64加密換行符

base64加密換行符

發布時間: 2022-08-16 11:56:40

㈠ 求進行base64解碼的思路

關於這個編碼的規則:
①.把3個字元變成4個字元..
②每76個字元加一個換行符..
③.最後的結束符也要處理..
對於①就是 4個字元32位..有個字元..24位...相差8個位..這8個位..會平均分給每個位元組的高兩位..則好2*4 = 8.嗎...

下面是我用C++實現的...帶有注釋...通過移位操作實現的...對移位操作不熟悉的朋友可能有點吃力了...

void base642(char * string ,char * pch)
{
int i = 0;
BYTE b1 ,b2 ,b3;

CAtlStringA str(string);
int len = str.GetLength();

char b;
do
{
//

b1 = string[i++];

//b1 右移2位..高2位清0...
//b1.剩下2位要放在第2個字元中..
b = BASE64TABLE[b1>>2];
//得到第1個字元..
*pch ++ = b;
//判斷是不是該換行了..76個字元要換行.放在這里..避免i=1的時候換行..
if(i % 76 == 0)
{
*pch ++ = '\r';
*pch ++ = '\n';
}

b2 = string[i++];

//(b1的最後2位要放在b2的第6位(7.8兩位要填充0))b1.要左移4位... b2 右移4位...然後相加..在把最高2位清0..
//b2.剩下4位.要放在第3個字元中...
b = BASE64TABLE[((b1 << 4) + (b2 >> 4)) &(0x3f)];
//得到第2個字元..
*pch ++ = b;

//如果沒有第3個字元了..那就停止循環了..
////這里不能是>= ...因為還要處理最後一個0x00結束符..len不包含最後結束符...
if(i > len)
break;//①

b3 = (BYTE) string[i++];

//b2的4位要放在第3個字元的第6位...b2.要左移2位...b3要右移6位..高2位放在此字元的最後兩位..
//b3 就剩下了6個字元...
b = BASE64TABLE[((b2 << 2) + (b3 >>6)) &(0x3f)];

*pch ++ = b;

//如果超過了.就停止了吧..
if(i > len)
break;//②

///b3高2位清0 .就可以得到第4個字元...
b = BASE64TABLE[b3 &(0x3f)];

*pch ++ = b;

}while(i < len);

//取得余數..
int resie = len % 3;

///判斷最後要加幾個=號..
int y = (resie == 1) ? 2 : (resie == 2 ? 1 : 0) ;

for(int i = 0;i< y ;i++)
*pch++ = '=';

/*
這個演算法...當中的break.總是感覺會丟失位...
但是仔細一想.最後一字元是0x00....丟失了..也不要緊..

假設有1個字元.. 加上一個結束符..實際上是兩個字元..到①這個位置會break...丟失了4位...這4位全部是0..
假設有2個字元..加上一個結束符..實際上是三個字元.到②這個位置會break..丟失6位..同伴全部是0..
假設有3個字元...剛好處理完畢...最後一個結束符..不會處理了...

*/
}
void base642(char * string ,char * pch)
{
int i = 0;
BYTE b1 ,b2 ,b3;

CAtlStringA str(string);
int len = str.GetLength();

char b;
do
{
//

b1 = string[i++];

//b1 右移2位..高2位清0...
//b1.剩下2位要放在第2個字元中..
b = BASE64TABLE[b1>>2];
//得到第1個字元..
*pch ++ = b;
//判斷是不是該換行了..76個字元要換行.放在這里..避免i=1的時候換行..
if(i % 76 == 0)
{
*pch ++ = '\r';
*pch ++ = '\n';
}

b2 = string[i++];

//(b1的最後2位要放在b2的第6位(7.8兩位要填充0))b1.要左移4位... b2 右移4位...然後相加..在把最高2位清0..
//b2.剩下4位.要放在第3個字元中...
b = BASE64TABLE[((b1 << 4) + (b2 >> 4)) &(0x3f)];
//得到第2個字元..
*pch ++ = b;

//如果沒有第3個字元了..那就停止循環了..
////這里不能是>= ...因為還要處理最後一個0x00結束符..len不包含最後結束符...
if(i > len)
break;//①

b3 = (BYTE) string[i++];

//b2的4位要放在第3個字元的第6位...b2.要左移2位...b3要右移6位..高2位放在此字元的最後兩位..
//b3 就剩下了6個字元...
b = BASE64TABLE[((b2 << 2) + (b3 >>6)) &(0x3f)];

*pch ++ = b;

//如果超過了.就停止了吧..
if(i > len)
break;//②

///b3高2位清0 .就可以得到第4個字元...
b = BASE64TABLE[b3 &(0x3f)];

*pch ++ = b;

}while(i < len);

//取得余數..
int resie = len % 3;

///判斷最後要加幾個=號..
int y = (resie == 1) ? 2 : (resie == 2 ? 1 : 0) ;

for(int i = 0;i< y ;i++)
*pch++ = '=';

/*
這個演算法...當中的break.總是感覺會丟失位...
但是仔細一想.最後一字元是0x00....丟失了..也不要緊..

假設有1個字元.. 加上一個結束符..實際上是兩個字元..到①這個位置會break...丟失了4位...這4位全部是0..
假設有2個字元..加上一個結束符..實際上是三個字元.到②這個位置會break..丟失6位..同伴全部是0..
假設有3個字元...剛好處理完畢...最後一個結束符..不會處理了...

*/
}

這個是解碼的函數.

view plain to clipboardprint?
void base644(char * string ,char * pch)
{
CAtlStringA tab("+/");
CAtlStringA str(string);

str.Remove('=');
str.Remove('\r');
str.Remove('\n');

int len = str.GetLength();

int i = 0;
BYTE b1 ,b2 ,b3 ,b4;
char ch;
do
{
//找字元1的位置.
b1 = tab.Find((str[i++]));

//找字元2的位置.
b2 = tab.Find((str[i++]));

//b1左移兩位..還原.此時少了最後兩位...b2的第6位和第5位..要右移4位(變成最後兩位.)..此時和b1相加...即可
//b1還原...
ch = (b1 << 2) + (b2 >> 4);
//得到此位元組..
*pch ++ = ch;

//超過了..break吧..這是要有這個=號...當=成立的時候.表明已經是最後一個字元了...後面不要處理..
if(i >= len)
break;
//取第3個字元..的位置
b3 = tab.Find((str[i++]));

//從這里開始判斷..因為=號最多有兩個...換行是額外加的..所以編碼後有效的字元至少為2個..

//還原第2個字元...b2中有b1的兩個位..所以b2左移4位..即可把b1的兩個位和00兩個最高位去除..b2中只有
//有效的4個位..b3中還有4個位....b3右移2位..即可把5位6位變成低4位..因為要相加的..
ch = (b2 <<4) + (b3 >> 2);

*pch ++ = ch;
//超過了..break吧.
if(i >= len)
break;
//找第4個字元..
b4 = tab.Find((str[i++]));

//還原第3個字元...b3中有兩個位...要放在最高兩位...所以左移6位..加上b4即可..(b4的高兩位為0..)
ch = (b3 << 6) + b4;

*pch ++ = ch;

}
while(i < len);
////最後加個結束符...
*pch =0x00;
}
void base644(char * string ,char * pch)
{
CAtlStringA tab("+/");
CAtlStringA str(string);

str.Remove('=');
str.Remove('\r');
str.Remove('\n');

int len = str.GetLength();

int i = 0;
BYTE b1 ,b2 ,b3 ,b4;
char ch;
do
{
//找字元1的位置.
b1 = tab.Find((str[i++]));

//找字元2的位置.
b2 = tab.Find((str[i++]));

//b1左移兩位..還原.此時少了最後兩位...b2的第6位和第5位..要右移4位(變成最後兩位.)..此時和b1相加...即可
//b1還原...
ch = (b1 << 2) + (b2 >> 4);
//得到此位元組..
*pch ++ = ch;

//超過了..break吧..這是要有這個=號...當=成立的時候.表明已經是最後一個字元了...後面不要處理..
if(i >= len)
break;
//取第3個字元..的位置
b3 = tab.Find((str[i++]));

//從這里開始判斷..因為=號最多有兩個...換行是額外加的..所以編碼後有效的字元至少為2個..

//還原第2個字元...b2中有b1的兩個位..所以b2左移4位..即可把b1的兩個位和00兩個最高位去除..b2中只有
//有效的4個位..b3中還有4個位....b3右移2位..即可把5位6位變成低4位..因為要相加的..
ch = (b2 <<4) + (b3 >> 2);

*pch ++ = ch;
//超過了..break吧.
if(i >= len)
break;
//找第4個字元..
b4 = tab.Find((str[i++]));

//還原第3個字元...b3中有兩個位...要放在最高兩位...所以左移6位..加上b4即可..(b4的高兩位為0..)
ch = (b3 << 6) + b4;

*pch ++ = ch;

}
while(i < len);
////最後加個結束符...
*pch =0x00;
}

//下面是測試程序.

view plain to clipboardprint?
int _tmain(int argc, _TCHAR* argv[])
{
char pch[0x1dc]={0};
CAtlStringA str("謝謝你啊" );
CStrBufA buf(str);
base642(CStrBufA::PXSTR(buf),pch);
cout <<pch<<endl;
cout <<"********************************************************************************"<<endl;

CAtlStringA str2 = "0LvQu8TjsKE=";
CStrBufA buf2(str2);
RtlZeroMemory(pch ,0x1dc);
base644(CStrBufA::PXSTR(buf2) ,pch);

cout <<pch<<endl;

return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
char pch[0x1dc]={0};
CAtlStringA str("謝謝你啊" );
CStrBufA buf(str);
base642(CStrBufA::PXSTR(buf),pch);
cout <<pch<<endl;
cout <<"********************************************************************************"<<endl;

CAtlStringA str2 = "0LvQu8TjsKE=";
CStrBufA buf2(str2);
RtlZeroMemory(pch ,0x1dc);
base644(CStrBufA::PXSTR(buf2) ,pch);

cout <<pch<<endl;

return 0;
}

用到的數組.

const char BASE64TABLE[64]={
'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b',
'c','d','e','f','g','h','i','j','k','l','m','n','o','p',
'q','r','s','t','u','v','w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/'
};

這個作用就是....26剛好64...base64會計算每個字元的6位...然後從這個表中選中一個字母.作為最後的編碼...base64當中沒有其它的字元了...

如果字元數不是3的倍數..就相應的加上=號..最多有兩個等號了..純粹是為了湊數...

上面是C的,下面是C++的:
#include <string>
using namespace std;

class ZBase64
{
public:
/*編碼
DataByte
[in]輸入的數據長度,以位元組為單位
*/
string Encode(const unsigned char* Data,int DataByte);
/*解碼
DataByte
[in]輸入的數據長度,以位元組為單位
OutByte
[out]輸出的數據長度,以位元組為單位,請不要通過返回值計算
輸出數據的長度
*/
string Decode(const char* Data,int DataByte,int& OutByte);
};

#include "stdAfx.h"
#include "ZBase64.h"

string ZBase64::Encode(const unsigned char* Data,int DataByte)
{
//編碼表
const char EncodeTable[]="+/";
//返回值
string strEncode;
unsigned char Tmp[4]={0};
int LineLength=0;
for(int i=0;i<(int)(DataByte / 3);i++)
{
Tmp[1] = *Data++;
Tmp[2] = *Data++;
Tmp[3] = *Data++;
strEncode+= EncodeTable[Tmp[1] >> 2];
strEncode+= EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];
strEncode+= EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];
strEncode+= EncodeTable[Tmp[3] & 0x3F];
if(LineLength+=4,LineLength==76) {strEncode+="\r\n";LineLength=0;}
}
//對剩餘數據進行編碼
int Mod=DataByte % 3;
if(Mod==1)
{
Tmp[1] = *Data++;
strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];
strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4)];
strEncode+= "==";
}
else if(Mod==2)
{
Tmp[1] = *Data++;
Tmp[2] = *Data++;
strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];
strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];
strEncode+= EncodeTable[((Tmp[2] & 0x0F) << 2)];
strEncode+= "=";
}

return strEncode;
}

string ZBase64::Decode(const char* Data,int DataByte,int& OutByte)
{
//解碼表
const char DecodeTable[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62, // '+'
0, 0, 0,
63, // '/'
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'
0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'
0, 0, 0, 0, 0, 0,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'
};
//返回值
string strDecode;
int nValue;
int i= 0;
while (i < DataByte)
{
if (*Data != '\r' && *Data!='\n')
{
nValue = DecodeTable[*Data++] << 18;
nValue += DecodeTable[*Data++] << 12;
strDecode+=(nValue & 0x00FF0000) >> 16;
OutByte++;
if (*Data != '=')
{
nValue += DecodeTable[*Data++] << 6;
strDecode+=(nValue & 0x0000FF00) >> 8;
OutByte++;
if (*Data != '=')
{
nValue += DecodeTable[*Data++];
strDecode+=nValue & 0x000000FF;
OutByte++;
}
}
i += 4;
}
else// 回車換行,跳過
{
Data++;
i++;
}
}
return strDecode;
}

使用示例(結合CxImage庫):

CString CScanDlg::EncodeImage()
{//對圖片進行Base64編碼
ZBase64 zBase;
//圖片編碼
CxImage image; // 定義一個CxImage對象
image.Load(this->m_strImgPath, CXIMAGE_FORMAT_JPG); //先裝載jpg文件,需要指定文件類型
long size=0;//得到圖像大小
BYTE* buffer=0;//存儲圖像數據的緩沖
image.Encode(buffer,size,CXIMAGE_FORMAT_JPG);//把image對象中的圖像以type類型數據到buffer
string strTmpResult=zBase.Encode(buffer,size);
CString result;
result = strTmpResult.c_str();
return result;
}

void CScanDlg::DecodeImageData(CString strData)
{//對Base64編碼過的數據解碼並顯示原圖片

ZBase64 zBase;
int OutByte=0;
string strTmpResult=zBase.Decode(strData,strData.GetLength(),OutByte);
int i,len = strTmpResult.length();
BYTE *buffer = new BYTE[len];
for (i=0;i<len;++i)
{
buffer[i] = strTmpResult[i];
}
CxImage image(buffer,len,CXIMAGE_FORMAT_JPG);//把內存緩沖buffer中的數據構造成Image對象
delete [] buffer;
CDC* hdc = m_picture.GetDC();
m_bitmap = image.MakeBitmap(hdc->m_hDC);
HBITMAP h0ldBmp = m_picture.SetBitmap(m_bitmap);
if(h0ldBmp) DeleteObject(h0ldBmp);
if(hdc->m_hDC) m_picture.ReleaseDC(hdc);
if(m_bitmap) DeleteObject(m_bitmap);
}

㈡ 求助 關於Base64解碼的問題

BASE64編碼,有幾點注意,第一,編碼的時候是否添加換行符,第二,空字元即「=」你是否處理了,第三,解碼時的邏輯是否和編碼相符合。

㈢ 如何使用Base64進行加密和解密

其實Base64的加密和解密的演算法不是很復雜,首先是定義自己64位的密鑰,64個字元是固定,但是順序是可以隨自己的設計而變化。例如:
char[] BaseTable=new char[64]{
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/'};

接下來,在加密的時候就是對於需要加密的每個字元,通過一定的演算法,轉換成上面64字元的一種;而在解密的時候則是把64字元中任意一個字元反算出加密前的字元。對於每個字元的操作有很多方法,這里就不一一介紹了。需要注意的是「=」字元,在Base64加密演算法中,是很重要的,它是起到補零作用。

以下是完整代碼:
//----------------------------- Base64 class --------------------------------------
//---------------------------------------------------------------------------------
//---File:clsBase64
//---Description:The class file to encode string or decode string in base algorith
//---Author:Knight
//---Date:Oct.8, 2005
//---------------------------------------------------------------------------------
//----------------------------{ Base64 class }-------------------------------------
using System;

namespace Base64
{
/// <summary>
/// Summary description for clsBase64.
/// </summary>
public class clsBase64
{
private char[] source;
private char[] lookupTable;
private int length, length2, length3;
private int blockCount;
private int paddingCount;

public clsBase64()
{
//
// TODO: Add constructor logic here
//
source = null;
length = length2 = length3 =0;
blockCount = 0;
paddingCount = 0;
}

/// <summary>
/// Create base64 char array using default base64 char array
/// </summary>
/// <param name="CreatePara"></param>
/// <returns>return the new base64 char array</returns>
private char[] CreateBase64Char( ref char[] CreatePara )
{
char[] BaseTable=new char[64]{
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/'};

const int CREATE_TYPE = 8;
byte bParaValue = 0;
byte bTemp;
for( int i = 0; i < CreatePara.Length; i++ )
{
bTemp = ( byte )( CreatePara[i] );
switch( bTemp % CREATE_TYPE )
{
case 1:
// 00000001
bTemp =( byte )( bTemp ^ 0x01 );
break;
case 2:
// 00000010
bTemp =( byte )( bTemp ^ 0x02 );
break;
case 3:
// 00000100
bTemp =( byte )( bTemp ^ 0x04 );
break;
case 4:
// 00001000
bTemp =( byte )( bTemp ^ 0x08 );
break;
case 5:
// 00010000
bTemp =( byte )( bTemp ^ 0x10 );
break;
case 6:
// 00100000
bTemp =( byte )( bTemp ^ 0x20 );
break;
case 7:
// 01000000
bTemp =( byte )( bTemp ^ 0x40 );
break;
default:
// 10000000
bTemp =( byte )( bTemp ^ 0x80 );
break;
}
bParaValue =( byte )( bParaValue ^ bTemp );
}

char chrTemp;
int nIndex;
switch( bParaValue % CREATE_TYPE )
{
case 1:
// Exechange 0 <--> 1, 2 <--> 3, 4 <--> 5, 6 <--> 7
for( int i = 0; i < BaseTable.Length / CREATE_TYPE; i++ )
{
nIndex = i * CREATE_TYPE;
chrTemp = BaseTable[nIndex];
BaseTable[nIndex] = BaseTable[nIndex + 1];
BaseTable[nIndex + 1] = chrTemp;
chrTemp = BaseTable[nIndex + 2];
BaseTable[nIndex + 2] = BaseTable[nIndex + 3];
}
//remove paddings
length3=length2-paddingCount;
byte[] result=new byte[length3];

for(int x=0;x<length3;x++)
{
result[x]=buffer2[x];
}

return result;
}

private byte char2sixbit(char c)
{
if( c=='=' )
return 0;
else
{
for (int x=0;x<64;x++)
{
if (lookupTable[x]==c)
return (byte)x;
}
//should not reach here
return 0;
}
}

}
}

㈣ 怎麼用base64加密字元串

base64的作用不是加密,而是用來避免「位元組」中不能轉換成可顯示字元的數值。 比如0-32的控制字元,空格,製表符都不能被列印在紙上,base64隻使用大寫小寫數字標點。 可以列印在紙上,數據可以在傳統平面媒介上攜帶。 md5是散列函數,提取數據的特徵,輸出是不可逆的散列值,用於代表某信息A而又不暴露信息A的內容。不直接用於加密文件。

㈤ 為什麼DES加密結果後多個換行符

android.util.Base64.encodeToString(result, 0);
這個byte轉換為string時的問題
是這個問題

㈥ 為什麼Base64編碼有回車換行符

The encoded output stream must be represented in lines of no more than 76 characters each.

Base64一行不能超過76字元,超過則添加回車換行符。

結合前面博客說的「有回車符,導致JSON格式不符合要求」,那就明白了,對附件進行Base64編碼,因為超過76位元組,所以要添加回車換行符,後台解析帶有回車換行符的JSON字元串就出現「 net.sf.json.JSONException : Unterminated string 」。

問題根源就是回車換行符,那刪除就行了,谷歌後又發現一問題,原來「回車換行符( )」是在Windows才有,而linux只有換行( ),Mac只有回車( )。

㈦ Java Base64加碼解碼 Base64.encodeBase64 ( ) 和 new BASE64Enccoder( ).encode( )區別

Base64.encodeBase64 ( ) 可以處理換行符,
new BASE64Enccoder( ).encode( )需要單獨處理換行符。
在linux/windows下,推薦使用第一種,不用自己單獨處理換行。

㈧ 怎麼去掉換行 - Java

把輸出結果的\r\n替換成「」不就行了

熱點內容
只狼和看門狗哪個配置高 發布:2025-05-17 12:50:21 瀏覽:205
扁桃玩的伺服器地址 發布:2025-05-17 12:18:25 瀏覽:509
u盤上傳歌 發布:2025-05-17 12:14:51 瀏覽:613
入門c語言設計 發布:2025-05-17 12:08:31 瀏覽:41
c3演算法 發布:2025-05-17 12:04:19 瀏覽:365
phprecv 發布:2025-05-17 11:55:00 瀏覽:613
福建時鍾監控網關伺服器雲主機 發布:2025-05-17 11:54:28 瀏覽:251
c資料庫壓縮 發布:2025-05-17 11:39:22 瀏覽:965
安卓手機如何連接音響功放 發布:2025-05-17 11:37:48 瀏覽:965
破解exe加密視頻 發布:2025-05-17 11:23:41 瀏覽:981