blowfish

blowfish

BlowFish是一個容易使用的檔案和資料夾加密軟體,只要用滑鼠把把檔案或資料夾拖到加密的文檔地方。

基本信息

blowfishblowfish
BlowFish是一個容易使用的檔案資料夾加密軟體,只要用滑鼠把把檔案或檔案夾拖到加密的文檔地方。

軟體信息

BlowFish2000V3.1

軟體大小:1.39MB

軟體語言:英文

軟體類別:國外軟體/共享軟體/加密工具. . 套用平台:Win9x/WinNT/Win2000/WinXP/............

更新時間:2006-04-1615:13:57.........

BlowFish2000v3.0.............

軟體大小:1.39MB

軟體語言:英文

軟體類型:國外軟體-安全相關-加密工具

授權方式:共享軟體

運行環境:Win9X/Win2000/WinXP/Win2003/...........

更新時間:/2005-5-2513:46:28

BlowFish2000v3.0Final...............正式版

軟體大小:1.7MB/

軟體語言:英文

軟體授權:共享軟體

軟體類型:國外軟體-安全相關-加密工具

系統支持:Win2003,WinXP,Win2000.........

更新日期:2005年10月03日/

軟體詳細信息

BlowfishAdvancedCS是一個新的檔案加密工具,它支持七種以上的算法,能將數據有效的壓縮,而且使用安全的金鑰來把守防止數據被破解,同時加密之後檔案不會露出蛛絲馬跡,不容易用各種軟體找到破解線索,並且能與Windows檔案總管做整合,設定每日自動檔案加密工作。

BlowfishAdvancedCS軟體支持的功能主要有加密(Encrypt)、解密(Decrypt)、消除數據(Wipe),在檔案加密的同時可以設定開啟密碼,也能壓縮數據,或者更改檔案名稱,更改之後的檔名通常以無意義的隨機數檔案名稱為主,若不更改檔案名稱則加密之後會改以擴展名bfa來儲存,因此不容易被人察覺,要解密時只要輸入密碼並且使用本軟體選擇相同的算法即可。

BlowFish算法說明

BlowFish算法用來加密64Bit長度的字元串。

BlowFish算法使用兩個“盒”——ungignedlongpbox[18]和unsignedlongsbox[4,256]。

BlowFish算法中,有一個核心加密函式:BF_En(後文詳細介紹)。該函式輸入64位信息,運算後,以64位密文的形式輸出。用BlowFish算法加密信息,需要兩個過程:

1.密鑰預處理

2.信息加密

分別說明如下:

密鑰預處理:

BlowFish算法的源密鑰——pbox和sbox是固定的。我們要加密一個信息,需要自己選擇一個key,用這個key對pbox和sbox進行變換,得到下一步信息加密所要用的key_pbox和key_sbox。具體的變化算法如下:

1)用sbox填充key_sbox

2)用自己選擇的key8個一組地去異或pbox,用異或的結果填充key_pbox。key可以循環使用。

比如說:選的key是"abcdefghijklmn"。則異或過程為:

key_pbox[0]=pbox[0]^abcdefgh

key_pbox[1]=pbox[1]^ijklmnab

…………

…………

如此循環,直到key_box填充完畢。

3)用BF_En加密一個全0的64位信息,用輸出的結果替換key_pbox[0]和key_pbox[1]。i=0

4)用BF_En加密替換後的key_pbox,key_pbox[i+1],用輸出替代key_pbox[i+2]和key_pbox[i+3]

5)i+2,繼續第4步,直到key_pbox全部被替換

6)用key_pbox[16]和key_pbox[17]做首次輸入(相當於上面的全0的輸入),用類似的方法,替換key_sbox信息加密。信息加密就是用函式把待加密信息x分成32位的兩部分:xL,xRBF_En對輸入信息進行變換,BF_En函式詳細過程如下:

對於i=1至16

xL=xL^Pi

xR=F(xL)^xR

交換xL和xR(最後一輪取消該運算)

xR=xR^P17

xL=xL^P18

重新合併xL和xR

函式F見下圖:

8位32位

|-----------s盒1-----------

||加

|8位32位|----

|-----------S盒2-----------|

||

||異或----

32位-|||

|8位32位||

|-----------S盒3---------------|加

||-----------------32位

||

||

|8位32位|

|-----------S盒4-----------------------

把xL分成4個8位分組:a,b,c和d

輸出為:F(xL)=((((S[1,a]+S[2,b])MOD4294967296)^s[3,c])+S[4,d])MOD4294967296

(2的32次方)(2的32次方)

重新合併後輸出的結果就是我們需要的密文。

用BlowFish算法解密,同樣也需要兩個過程。

1.密鑰預處理

2.信息解密

密鑰預處理的過程與加密時完全相同

信息解密的過程就是把信息加密過程的key_pbox逆序使用即可。

可以看出,選擇不同的key,用BlowFish算法加密同樣的信息,可以得出不同的結果。

要破解BlowFish算法,就是要得到BlowFish算法的key。所以,使用BlowFish算法進行加密,最重要的也就是key的選擇以及key的保密。其中key的選擇可以使用bf_sdk中的_WeakKey函式進行檢驗。以下是該函式的說明:

源文:

---------------------------------------------------------------------------------------

_WeakKey

Function:TestifthegeneratedBoxesareweak

Argument:none

Return:AX=Status(1=weak,0=good)

Affects:AX,BX,CX,DX,SI,DI,directionFlag

Description:After"_InitCrypt"youshouldtesttheBoxeswiththisfunction.

Iftheyprovideaweaknesswhichacryptoanalystcoulduseto

breaktheciphera"1"isreturned.Inthiscaseyoushould

reloadtheoriginalboxesandlettheuserchooseadifferent

password.

---------------------------------------------------------------------------------------

譯文:

---------------------------------------------------------------------------------------

_WeakKey

功能:測試產生的box是否安全

參數:無

返回:AX=1不安全;AX=0安全

影響:AX,BX,CX,DX,SI,DI,方向標誌

描述:使用"_InitCrypt"函式產生用於加密的Boxes後,你應該用這個函式測試產生的Boxes是否安全,如果該key產生的Boxes不安全——可以被密碼分析者通過分析Boxes得到key,那么,你應該採用另外一個key產生一個安全的Boxes用來加密。

---------------------------------------------------------------------------------------
BlowFish's 分析
[ 編輯本段 ]
由於該CrackMe主要是測試你的密碼學知識,所以沒有在其他方面設關卡。為了減小檔案體積,縮短大家下載的時間,用upx加了殼,直接用TRW2000的"PNewSec+Makepe"很方便地就能脫掉殼。

用常規的方法,很快找到下面關鍵比較處:

:004015D951pushecx

:004015DA52pushedx

:004015DB6880894000push00408980

:004015E0E8EBFAFFFFcall004010D0//BF_De(sn)

:004015E58B442464moveax,dwordptr[esp+64]

:004015E98B0DF0994000movecx,dwordptr[004099F0]

:004015EF83C41Caddesp,0000001C

:004015F23BC1cmpeax,ecx//比較

:004015F47529jne0040161F

:004015F68B4C244Cmovecx,dwordptr[esp+4C]

:004015FAA1EC994000moveax,dwordptr[004099EC]

:004015FF3BC8cmpecx,eax//比較

:00401601751Cjne0040161F

:004016036A30push00000030

由於BlowFish算法加密,解密輸出的信息都是64Bit的,所以要進行兩次比較。

我們既然知道了他對我們的sn進行的變換是BF_De,那么,很顯然,我們要找到程式初始化key_pbox和key_sbox的地方。跟進4015E0的Call,找到key_pbox在408980處,下bpm,然後跟蹤,分析,找到程式初始化key_pbox和key_sbox的地方,如下:

:004016C050pusheax

*PossibleStringDataReffromDataObj->"CrackingForFun"

|

:004016C16844804000push00408044

:004016C66880894000push00408980

:004016CBE860FAFFFFcall00401130//初始化Boxes

由此我們知道了BF_De(sn)的key是"CrackingForFun"。

問題的一半已經解決了。下面我們來看用來比較的另外的64Bit的數是從何而來。

bpm4099ECw

跟蹤分析後,發現這個用來比較的數是由BF_En(ComputerID,key="ChinaCrackingGroup")生成。

至此,我們可以寫出註冊機的算法:

sn=BF_En((BF_En(ComputerID,key="ChinaCrackingGroup"),key="CrackingForFun")

只要你編程夠強,密碼學也還過得去,寫出這個東西的註冊機就不是困難的事情了。

附:

ComputerID的產生

如果你對這個CrackMe很有興趣,還想研究一下他的ComputerID是如何產生的,也可以繼續跟蹤,分析,在這裡,我給處我分析的結果:

ComputerID=BF_En(0776f6c62h,068736966h,key=PW_1)

其中,PW_1就是你的Windows版本號,可以在“系統屬性”裡頭看到,也就是註冊表中的

H_L_M\Software\Microsoft\Windows\CurrentVersion中的ProductId項。在我的機器上是:

"25001-OEM-0080247-46673"

註冊機源碼裡頭有一些語句沒有派上用場,用“;”禁止了,如果你有興趣,可以把前面的;號去掉然後把.data段裡頭的PW_1換成你機器的ComputerID,再按照程式中的說明自己修改一下源程式,用Masm32V6重新編譯,直接按Generate,也能得到正確的序列號。

相關詞條

相關搜尋

熱門詞條

聯絡我們