[轉載]Base64編碼轉換原理-C語言
Base64編碼轉換原理-C語言
原文地址:http://blog.sina.com.cn/s/blog_592b00a90100n81d.html


Base64是一種加密方法。它的特點是:1、速度非常快。 2、能夠將字符串A轉換成字符串B,而且如果你光看字符串B,是猜不出字符串A的內容來的。

Base64編碼其實是將3個8位字節轉換為4個6位字節,( 3*8 = 4*6 = 24 ) 這4個六位字節其實仍然是8位,只不過高兩位被設置為0. 當一個字節只有6位有效時,它的取值空間為0到2的6次方減1 即63,也就是說被轉換的Base64編碼的每一個編碼的取值空間為( 0~63)。
事實上,0~63之間的ASCII碼有許多不可見字符,所以應該再做一個映射,


映射表
‘A‘ ~ ‘Z‘ ? ASCII(0 ~ 25)
‘a’ ~ ‘z‘ ? ASCII(26 ~ 51)
‘0’ ~ ‘9‘ ? ASCII(52 ~ 61)
‘+‘ ? ASCII(62)
‘/‘ ? ASCII(63)
這樣就可以將3個8位字節,轉換為4個可見字符。
具體的字節拆分方法為:

aaaaaabb ccccdddd eeffffff
~~~~~~~~ ~~~~~~~~ ~~~~~~~~
字節 1 字節 2 字節 3
││
\/
00aaaaaa 00bbcccc 00ddddee 00ffffff

注:上面的三個字節位原文,下面四個字節為Base64編碼,其前兩位均為0。
這樣拆分的時候,原文的字節數量應該是3的倍數,當這個條件不能滿足時,用全零字節
補足,轉化時Base64編碼用=號代替,這就是為什麼有些Base64編碼以一個或兩個等號結
束的原因,但等號最多有兩個,因為:如果F(origin)代表原文的字節數,F(remain)代
表餘數,則
F(remain) = F(origin) MOD 3 成立。
所以F(remain)的可能取值為0,1,2.
如果設 n = [F(origin) – F(remain)] / 3
當F(remain) = 0 時,恰好轉換為4*n個字節的Base64編碼。
當F(remain) = 1 時,由於一個原文字節可以拆分為屬於兩個Base64編碼的字節,為了
讓Base64編碼是4的倍數,所以應該為補2個等號。
當F(remain) = 2 時,由於兩個原文字節可以拆分為屬於3個Base64編碼的字節,同理,
應該補上一個等號。


下面給出Base64的編碼和解碼的C語言描述:
 
void Base64(unsigned char chasc[3],unsigned char chuue[4])
 
{
int i,k=2;
unsinged char t=NULL;
for(i=0;i<3;i++)
{
*(chuue+i)=*(chasc+i)>>k;
*(chuue+i)|=t;
t=*(chasc+i)<<(8-k);
t>>=2;
k+=2;
}
*(chuue+3)=*(chasc+2)&63;
for(i=0;i<4;i++)
if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65;
else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71;
else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4;
else if(*(chuue+i)==62) *(chuue+i)=43;
else if(*(chuue+i)==63) *(chuue+i)=47;
}
 
void unBase64(unsigned char chuue[4],unsigned char chasc[3])
 
{int i,k=2;
unsigned char t=NULL;
for(i=0;i<4;i++)
if((*(chuue+i)>=65)&&(*(chuue+i)<=90)) *(chuue+i)-=65;
else if((*(chuue+i)>=97)&&(*(chuue+i)<=122)) *(chuue+i)-=71;
else if((*(chuue+i)>=48)&&(*(chuue+i)<=57)) *(chuue+i)+=4;
else if(*(chuue+i)==43) *(chuue+i)=62;
else if(*(chuue+i)==47) *(chuue+i)=63;
else if(*(chuue+i)==61) *(chuue+i)=0;
for(i=0;i<3;i++)
{*(chhex+i)=*(chuue+i)<
k+=2;
t=*(chuue+i+1)>>8-k;
*(chhex+i)|=t;
}
}

arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()