2014-02-17 169 views
1

如果有人能向我解釋這一點,我將不勝感激。Base64編碼和解碼

我遇到了這個post(不重要只是參考),並看到一個令牌編碼base64解碼它的代碼。

EYl0htUzhivYzcIo+zrIyEFQUE1PQkk= -> t3+(:APPMOBI 

然後我試圖編碼T3 +(:APPMOBI再次使用Base64,看看我是否會得到相同的結果,但很驚訝地得到:

t3+(:APPMOBI - > dDMrKDpBUFBNT0JJ 

完全地不同的令牌

然後我試着解碼原始標記EYl0htUzhivYzcIo+zrIyEFQUE1PQkk=並得到了t3 +(:APPMOBI之間有隨機字符(我得到◄ëtå╒3å+╪═┬(√:╚╚APPMOBI可能是錯的,我很快就把它從我頭上脫下來了)

令牌差異的原因是什麼?它們不應該是相同的嗎?

+0

也許當他複製該令牌時,非打印字符被過濾掉了? – Zzz

+0

我複製並粘貼了'◄ëtå╒3å+╪═┬(√:╚╚APPMOBI'這個解碼的標記,所有的字符都在ASCII表中 – J2D8T

+1

@ J2D8T實際上,任何高於0x7F的字節都是無效的[ASCII](http://en.wikipedia.org/wiki/ASCII)。 – Gumbo

回答

1

問題出在您向您顯示輸出的編碼中,或者您用於將數據輸入到base64的編碼中。這實際上是base64編碼被髮明來幫助解決的問題。

不是試圖複製和粘貼非ASCII字符,而是將輸出保存爲二進制文件,然後檢查它。然後,編碼二進制文件。你會看到相同的base64字符串。

c:\TEMP>type b.txt 
EYl0htUzhivYzcIo+zrIyEFQUE1PQkk= 

c:\TEMP>base64 -d b.txt > b.bin 

c:\TEMP>od -t x1 b.bin 
0000000 11 89 74 86 d5 33 86 2b d8 cd c2 28 fb 3a c8 c8 
0000020 41 50 50 4d 4f 42 49 

c:\TEMP>base64 -e b.bin 
EYl0htUzhivYzcIo+zrIyEFQUE1PQkk= 

od是一個工具(八進制轉儲),使用十六進制表示法輸出的二進制數據,並且示出了每一個字節。

編輯:

你問你的意見,dDMrKDpBUFBNT0JJ不同的字符串,爲什麼是解碼到同樣的事情?那麼,它不解碼相同的事情。它解碼爲這個字節串:74 33 2b 28 3a 41 50 50 4d 4f 42 49.你的原始字符串被解碼爲這個字節串:11 89 74 86 d5 33 86 2b d8 cd c2 28 fb 3a c8 c8 41 50 50 4d 4f 42 49.

注意不同之處:將原始字符串解碼爲23個字節,將第二個字符串解碼爲僅12個字節。原始字符串包括非ASCII字節,如11,d5,d8,cd,c2,fb,c8,c8。這些字節在每個系統上都不以相同的方式打印。你稱它們爲「隨機字節」,但它們不是。它們是數據的一部分,base64旨在確保它們可以被傳輸。

我想明白爲什麼這些字符串是不同的,你需要先了解字符數據的性質,base64是什麼,以及它爲什麼存在。請記住,電腦只適用於數字,但人們需要使用熟悉的概念,如字母和數字。所以ASCII被創建爲一個「編碼」標準,代表了一個小數字(我們稱這個小數字爲「字節」)作爲字母或數字,以便人類可以讀取它。如果我們排成一組字節,我們可以拼出一條消息。 41 50 50 4d 4f 42 49是代表單詞APPMOBI的字節。我們將這樣一組字節稱爲「字符串」。

來自A-Z的每個字母和0-9中的每個數字都有一個用ASCII表示的數字。但是有許多不在標準中的額外數字,並不是所有這些數字都代表可見或合理的字母或數字。我們說他們是不可打印的。您的更長的消息包含許多不可打印的字節(您稱它們是隨機的。)

當像電子郵件這樣的計算機程序處理字符串時,如果字節是可打印的ASCII字符,則很容易。電子郵件程序知道如何處理它們。但是如果你的字節代表一張圖片,這些字節的值可能不是ASCII,並且各種電子郵件程序不知道如何處理它們。創建Base64是爲了獲取各種字節,包括可打印和不可打印的字節,並將它們轉換爲僅表示可打印字母的字符串。因爲它們都是可打印的,所以像電子郵件或網絡服務器這樣的程序可以輕鬆處理它們,即使它不知道它們實際上包含圖片。

這是你的新的字符串的解碼:

c:\TEMP>type c.txt 
dDMrKDpBUFBNT0JJ 

c:\TEMP>base64 -d c.txt 
t3+(:APPMOBI 
c:\TEMP>base64 -d c.txt > c.bin 

c:\TEMP>od -t x1 c.bin 
0000000 74 33 2b 28 3a 41 50 50 4d 4f 42 49 
0000014 

c:\TEMP>type c.bin 
t3+(:APPMOBI 
c:\TEMP> 
+0

我沒有原始的令牌,我從該帖子複製並粘貼。我試圖自己解碼它作爲練習,看看我是否會如果你通過base64decode.org運行'EYl0htUzhivYzcIo + zrIyEFQUE1PQkk ='或'dDMrKDpBUFBNT0JJ',它會給你t3 +(:APPMOBI爲什麼對於不同的令牌有相同的結果? – J2D8T

2

Base64編碼的整個目的是二進制數據編碼成文本表示,使得他們可以通過網絡傳輸或不損壞顯示。但諷刺的是與你指的是原來的職位,發生

EYl0htUzhivYzcIo + zrIyEFQUE1PQkk =沒有解碼到T3 +(:APPMOBI

相反,它包含了您正確地顯示一些二進制字節(不BTW隨機)。所以這個問題是由於原作者或者他/她使用「清理」的作者或者工具/瀏覽器,或者更確切地說破壞了解碼的二進制數據。編碼和解碼的數據(提供了相同的「基礎」,即對編碼文本使用相同的一組字符)。

t3 +(:APPMOBI確實會編碼成dDMrKDpBUFBNT0JJ

+0

如果你運行'EYl0htUzhivYzcIo + zrIyEFQUE1PQkk ='或'dDMrKDpBUFBNT0JJ'通過http://www.base64decode.org/它給你't3 +(:APPMOBI'爲什麼對不同的令牌有相同的結果? – J2D8T

+0

base64decode.org具有諷刺意味的是沒有顯示相同的問題二進制數據(我知道,這很難相信。)如果它回答你的問題,你會給我一個投票嗎?我想獲得超過50分,所以我可以評論其他問題。謝謝。 –