当前位置:首页 » 操作系统 » 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.不断进行,直到全部输入数据转换完成。

热点内容
sqlserver连接驱动 发布:2024-05-06 00:33:34 浏览:645
存储开销 发布:2024-05-06 00:13:38 浏览:953
服务器怎么盈利 发布:2024-05-05 23:56:16 浏览:941
java网站培训学校 发布:2024-05-05 23:43:11 浏览:40
淘宝搜索算法 发布:2024-05-05 23:37:07 浏览:998
sqlwhencasethen 发布:2024-05-05 23:27:51 浏览:641
模架编程软件 发布:2024-05-05 23:26:54 浏览:483
存储过程异常 发布:2024-05-05 23:24:03 浏览:399
winxp访问不了win7 发布:2024-05-05 23:05:23 浏览:734
算法牛 发布:2024-05-05 22:43:40 浏览:720