當前位置:首頁 » 操作系統 » base64演算法c

base64演算法c

發布時間: 2023-01-29 15:20:41

❶ 求進行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是網路上最常見的用於傳輸8Bit位元組代碼的編碼方式之一,在發送電子郵件時,伺服器認證的用戶名和密碼需要用Base64編碼,附件也需要用Base64編碼。
下面簡單介紹Base64演算法的原理,由於代碼太長就不在此貼出
Base64要求把每三個8Bit的位元組轉換為四個6Bit的位元組(3*8 = 4*6 = 24),然後把6Bit再添兩位高位0,組成四個8Bit的位元組,也就是說,轉換後的字元串理論上將要比原來的長1/3。
轉換後,我們用一個碼表來得到我們想要的字元串(也就是最終的Base64編碼),這個表是這樣的:
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
原文的位元組最後不夠3個的地方用0來補足,轉換時Base64編碼用=號來代替。這就是為什麼有些Base64編碼會以一個或兩個等號結束的原因,但等號最多隻有兩個。
舉一個例子,abc經過Base64編碼以後的結果是YWJj.

發郵件的時候所寫的信息自動在後台轉換然後傳輸...
參考資料: http://www.luocong.com/articles/show_article.asp?Article_ID=17

❸ 01加密方式-Base64編碼

說明
HTTP將Base64編碼用於基本的認證和摘要認證。
其可以方便的將用戶的任何輸入轉換成只包含特定字元的安全格式,服務於網路通信過程。
特點
1)可以將任意的二進制數據進行Base64編碼。
2)所有的數據都能被編碼為並只用65個字元就能表示的文本文件。
3)編碼後的65個字元包括A Z,a z,0~9,+,/,=
4)對文件或字元串進行Base64編碼後將比 原始大小增加33% 。
5)能夠逆運算
6)不夠安全,但卻被很多加密演算法作為編碼方式

1)將所有字元轉化為ASCII碼;
2)將ASCII碼轉化為8位二進制;
3)將二進制3個歸成一組(不足3個在後邊補0)共24位,再拆分成4組,每組6位;
4)統一在6位二進制前補兩個0湊足8位;
5)將補0後的二進制轉為十進制;
6)從Base64編碼表獲取十進制對應的Base64編碼;

a.轉換的時候,將三個byte的數據,先後放入一個24bit的緩沖區中,先來的byte占高位。
b.數據不足3byte的話,則剩下的bit用0補足。每次取出6個bit,按照其值選擇查表選擇對應的字元作為編碼後的輸出。
c.不斷進行,直到全部輸入數據轉換完成。
d.如果最後剩下兩個輸入數據,在編碼結果後加1個「=」;
e.如果最後剩下一個輸入數據,編碼結果後加2個「=」;
f.如果沒有剩下任何數據,就什麼都不要加,這樣才可以保證資料還原的正確性。

運行效果圖

❹ 如何使用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;
}
}

}
}

❺ 2.哈希加密 & base64加密

一、哈希HASH

哈希(散列)函數  MD5 SHA1/256/512 HMAC

Hash的特點:

     1.演算法是公開的

     2.對相同數據運算,得到的結果是一樣的

     3.對不同數據運算,如MD5得到的結果是128位,32個字元的十六進製表示,沒法逆運算

1.MD5加密

MD5加密的特點:

    不可逆運算

    對不同的數據加密的結果是定長的32位字元(不管文件多大都一樣)

    對相同的數據加密,得到的結果是一樣的(也就是復制)。

    抗修改性 : 信息「指紋」,對原數據進行任何改動,哪怕只修改一個位元組,所得到的 MD5 值都有很大區別.

    弱抗碰撞 : 已知原數據和其 MD5 值,想找到一個具有相同 MD5 值的數據(即偽造數據)是非常困難的.

    強抗碰撞: 想找到兩個不同數據,使他們具有相同的 MD5 值,是非常困難的

MD5 應用:

一致性驗證:MD5將整個文件當做一個大文本信息,通過不可逆的字元串變換演算法,產生一個唯一的MD5信息摘要,就像每個人都有自己獨一無二的指紋,MD5對任何文件產生一個獨一無二的數字指紋。

那麼問題來了,你覺得這個MD5加密安全嗎?其實是不安全的,不信的話可以到這個網站試試:md5破解網站。可以說嗖地一下就破解了你的MD5加密!

2.SHA加密

    安全哈希演算法(Secure Hash Algorithm)主要適用於數字簽名標准(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。當接收到消息的時候,這個消息摘要可以用來驗證數據的完整性。在傳輸的過程中,數據很可能會發生變化,那麼這時候就會產生不同的消息摘要。當讓除了SHA1還有SHA256以及SHA512等。

二、base64加密

1.Base64說明

    描述:Base64可以成為密碼學的基石,非常重要。

    特點:可以將任意的二進制數據進行Base64編碼

    結果:所有的數據都能被編碼為並只用65個字元就能表示的文本文件。

    65字元:A~Z a~z 0~9 + / =

    對文件進行base64編碼後文件數據的變化:編碼後的數據~=編碼前數據的4/3,會大1/3左右。

2.命令行進行Base64編碼和解碼

    編碼:base64 123.png -o 123.txt

    解碼:base64 123.txt -o test.png -D

2.Base64編碼原理

    1)將所有字元轉化為ASCII碼;

    2)將ASCII碼轉化為8位二進制;

    3)將二進制3個歸成一組(不足3個在後邊補0)共24位,再拆分成4組,每組6位;

    4)統一在6位二進制前補兩個0湊足8位;

    5)將補0後的二進制轉為十進制;

    6)從Base64編碼表獲取十進制對應的Base64編碼;

處理過程說明:

    a.轉換的時候,將三個byte的數據,先後放入一個24bit的緩沖區中,先來的byte占高位。

    b.數據不足3byte的話,於緩沖區中剩下的bit用0補足。然後,每次取出6個bit,按照其值選擇查表選擇對應的字元作為編碼後的輸出。

    c.不斷進行,直到全部輸入數據轉換完成。

熱點內容
江西省資料庫 發布:2024-04-18 08:17:42 瀏覽:903
文件加密知乎 發布:2024-04-18 08:15:27 瀏覽:118
頭條演算法頁面 發布:2024-04-18 07:10:46 瀏覽:435
寶馬4系簡配了哪些配置 發布:2024-04-18 07:05:41 瀏覽:789
迅雷最小緩存 發布:2024-04-18 06:56:05 瀏覽:214
編程Mu 發布:2024-04-18 06:38:23 瀏覽:594
正規伺服器搭建 發布:2024-04-18 06:37:17 瀏覽:102
hp存儲雙機 發布:2024-04-18 06:36:25 瀏覽:241
linuxmongo 發布:2024-04-18 06:18:22 瀏覽:622
國際版我的世界pc怎麼創伺服器 發布:2024-04-18 05:47:50 瀏覽:881