異或壓縮
⑴ 如何用代碼編寫一個神經網路異或運算器
配置環境、安裝合適的庫、下載數據集……有時候學習深度學習的前期工作很讓人沮喪,如果只是為了試試現在人人都談的深度學習,做這些麻煩事似乎很不值當。但好在我們也有一些更簡單的方法可以體驗深度學習。近日,編程學習平台 Scrimba 聯合創始人 Per Harald Borgen 在 Medium 上發文介紹了一種僅用30行 JavaScript 代碼就創建出了一個神經網路的教程,而且使用的工具也只有 Node.js、Synaptic.js 和瀏覽器而已。另外,作者還做了一個互動式 Scrimba 教程,也許能幫你理解其中的復雜概念。
Synaptic.js:http://synaptic.juancazala.com
Node.js:http://nodejs.org
Scrimba 教程:http://scrimba.com/casts/cast-1980
Synaptic.js 讓你可以使用 Node.js 和瀏覽器做深度學習。在這篇文章中,我將介紹如何使用 Synaptic.js 創建和訓練神經網路。
//創建網路const { Layer, Network }= window.synaptic;var inputLayer = new Layer(2);var hiddenLayer = new Layer(3);var outputLayer = new Layer(1);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);var myNetwork = new Network({
input: inputLayer,
hidden:[hiddenLayer],
output: outputLayer
});//訓練網路——學習異或運算var learningRate =.3;for (var i =0; i <20000; i++)
{//0,0=>0
myNetwork.activate([0,0]);
myNetwork.propagate(learningRate,[0]);//0,1=>1
myNetwork.activate([0,1]);
myNetwork.propagate(learningRate,[1]);//1,0=>1
myNetwork.activate([1,0]);
myNetwork.propagate(learningRate,[1]);//1,1=>0
myNetwork.activate([1,1]);
myNetwork.propagate(learningRate,[0]);
}//測試網路console.log(myNetwork.activate([0,0]));//[0.0]console.log(myNetwork.activate([0,1]));//[0.]console.log(myNetwork.activate([1,0]));//[0.]console.log(myNetwork.activate([1,1]));//[0.0]
我們將創建一個最簡單的神經網路:一個可以執行異或運算的網路。上面就是這個網路的全部代碼,但在我們深入解讀這些代碼之前,首先我們先了解一下神經網路的基礎知識。
神經元和突觸
神經網路的基本構造模塊是神經元。神經元就像是一個函數,有幾個輸入,然後可以得到一個輸出。神經元的種類有很多。我們的網路將使用 sigmoid 神經元,它可以輸入任何數字並將其壓縮到0 到1 之間。下圖就是一個 sigmoid 神經元。它的輸入是5,輸出是1。箭頭被稱為突觸,可以將該神經元與網路中的其它層連接到一起。
現在訓練這個網路:
// train the network - learn XORvar learningRate =.3;for (var i =0; i <20000; i++){ //0,0=>0
myNetwork.activate([0,0]);
myNetwork.propagate(learningRate,[0]);//0,1=>1
myNetwork.activate([0,1]);
myNetwork.propagate(learningRate,[1]);//1,0=>1
myNetwork.activate([1,0]);
myNetwork.propagate(learningRate,[1]);//1,1=>0
myNetwork.activate([1,1]);
myNetwork.propagate(learningRate,[0]);
}
這里我們運行該網路20000次。每一次我們都前向和反向傳播4 次,為該網路輸入4 組可能的輸入:[0,0][0,1][1,0][1,1]。
首先我們執行 myNetwork.activate([0,0]),其中[0,0]是我們發送給該網路的數據點。這是前向傳播,也稱為激活這個網路。在每次前向傳播之後,我們需要執行反向傳播,這時候網路會更新自己的權重和偏置。
反向傳播是通過這行代碼完成的:myNetwork.propagate(learningRate,[0]),其中 learningRate 是一個常數,給出了網路每次應該調整的權重的量。第二個參數0 是給定輸入[0,0]對應的正確輸出。
然後,該網路將自己的預測與正確的標簽進行比較,從而了解自己的正確程度有多少。
然後網路使用這個比較為基礎來校正自己的權重和偏置值,這樣讓自己的下一次猜測更加正確一點。
這個過程如此反復20000次之後,我們可以使用所有四種可能的輸入來檢查網路的學習情況:
->[0.0]console.log(myNetwork.activate([0,1]));
->[0.]console.log(myNetwork.activate([1,0]));
->[0.]console.log(myNetwork.activate([1,1]));
->[0.0]
如果我們將這些值四捨五入到最近的整數,我們就得到了正確的異或運算結果。
這樣就完成了。盡管這僅僅只碰到了神經網路的表皮,但也足以幫助你進一步探索 Synaptic 和繼續學習了。http://github.com/cazala/synaptic/wiki 這里還包含了更多好教程。
⑵ 3.35 國服痛苦SS ForteXorcist 這個怎麼用
將下載的壓縮包直接解壓到Addons的目錄下就行了,然後進入游戲設置。中文版的很簡單,慢慢看就能弄明白。剔除不需要的,留下自己需要的,然後慢慢適應新的插件。
⑶ Java,把字元竄壓縮成十六進制,並且壓縮一半
12345678910111213141516171819小豬,已解答,採納即可publicclassRectangle{publicstaticvoidmain(String[]args){StringS1="0412134FFFFFFFFFF";StringT1="00007770000200";longsi=Long.parseLong(S1,16);longti=Long.parseLong(T1);longst=si^//很顯然是十進制0~9//4693090553043039415System.out.println(st);Stringhex=Long.toHexString(st);//412134fe30df34b7System.out.println(hex);}}
追問
按照異或的演算法,首位0和0異或的結果不是應該是0嗎?為什麼算出來後結果的第一位是4?還是說內部執行的機制不是這樣的?求教,謝謝
⑷ rar是什麼格式啊我的機子怎麼不能運行這個格式啊
在計算機科學中,RAR是一種文件壓縮與歸檔的私有格式。
來 源
RAR的名字源自其作者Eugene Roshal,為Roshal ARchive的縮寫。Eugene Roshal最初編寫了DOS
版本的編碼和解碼程序,後來移植到很多平台,例如比較著名的Windows平台上的WinRAR。Eugene Roshal有條件的公開了解碼
程序的源代碼,但是編碼程序仍然是私有的。
主要特點
RAR文件的擴展名是.rar,MIME類型是application/x-rar-compressed。
同樣是無損數據壓縮,RAR文件通常比ZIP文件壓縮比要高,但是壓縮速度較慢。因為RAR文件頭也要佔據一定空間,在數據壓縮餘地不大時,壓縮過的文件可能比原文件要大。RAR的一個主要優點是可以把文件壓縮目標分割到多個文件,並且很容易從這樣的分割的壓縮文件解壓出源文件。
另外,RAR也支持緊縮格式,把所有文件壓縮到同一個數據區以加大壓縮比,代價是解壓一個單獨的文件時必須解壓其前面的所有文件。新的RAR的加密演算法使用的是AES,而舊的RAR的加密演算法是私有的。這兩種演算法都很難破解,所以在沒有密碼的情況下只能用字典暴力破解法來破解。RAR中也可以加入冗餘的修復信息,在文件損壞但是修復信息足夠完好時可以對壓縮包進行修復。
打開工具
RAR,WINRAR
RAR文件是一種最常用的壓縮文件,用WinRAR軟體打開處理。
WinRAR 是 32 位 Windows 版本的 RAR 壓縮文件管理器 ——一個允許你創建、管理和控制壓縮文件的強大工具。存在一系列的 RAR 版本,應用於數個操作系統環境:Windows、Linux、FreeBSD 、DOS、OS/2、MacOS X。
為什麼不能被秒破?
一、Rar文件生成的流程。
Winrar加密文件時,總的分兩個步驟:
1:先把源文件壓縮,壓成一段數據段。
2:再將壓縮完的數據段加密。
對於同一個源文件來說,不進行加密,壓縮完,其rar文件中的數據段是一模一樣的。但是如果對同一個源文件來說,即使使用同一個密碼,加密完rar文件中的數據段是不一樣的,這是由於加密的密鑰是依賴於一個Salt(8個位元組的密鑰,用來加密時使用,存放在rar文件頭中里)
所以要解密rar加密文件關鍵在於數據解密這一步,那我們接下來研究一下如何加密的。
二、加密「壓縮完的數據段」的流程
1、獲取密鑰:
將明文的密碼與Salt一起,通過HASH演算法,生成兩個16位元組的密鑰。(一個是KEY(AES演算法的參數),一個是initVector)
2、以Key和initVector來加密壓縮數據:
這里,是一個循環加密的結構,每16位元組作為一個塊,進行加密(這可能正是為什麼加密完的文件長度總為16倍數的原因)。加密採用AES演算法(RAR採用的是AES的rijndael的標准應用)。這里注意:AES加密前,有一個異或運算,是先將每16位元組塊與上一個16位元組塊加密結果進行異或,然後再進行AES演算法的。我用一個簡單的示意代碼看說明:
;===============================================
packblock[0]=packblock^initVector
encryptBlock[0]=AES(packblock[0]) ;(KEY為AES的密鑰)
for i=1 to 塊數量-1
packblock=packblock^encryptBlock[i-1]
encryptBlock=AES(packblock) ;(KEY為AES的密鑰)
next
;packblock表示壓縮完的每16位元組數據
;encryptBlock表示加密完的每16位元組數據
;===============================================
三、解密的過程
由於AES演算法是對稱的,所以解密的過程,是加密過程的逆運算。但解密時AES演算法過程與加密所用的不一樣(是因為解密過程中由KEY生成的子密鑰表不一樣)。仍然需要我們將密碼輸入,與salt一起生成兩個16位元組密鑰,KEY和initVector。
;===============================================
packblock[0]=AES1(encryptBlock[0]) ;(KEY為AES的密鑰)
packblock[0]=packblock^initVector
for i=1 to 塊數量-1
packblock=AES1(encryptBlock) ;(KEY為AES的密鑰)
packblock=packblock^encryptBlock[i-1]
next
;===============================================
那判斷密碼是否正確的在什麼地方呢?
解密的過程是解密後的數據塊進行解壓縮,然後解成源文件,對該文件進行CRC校驗,存在RAR文件中的源文件CRC校驗碼比較,相同則密碼正確,不相同則密碼錯誤。
四、無法秒破的原因
從上面,我們了解了RAR文件的整體思路。地球人都知道,解密時,肯定有個步驟是來判斷密碼的正確與否。而且,依據以往的經驗,我們也許可以將某些判斷的點移動,那樣可以縮減破解的流程思路。那RAR的這一步在哪裡?它把校驗放在了最後的一步。如果要秒破,我們該怎麼做泥?至少我認為目前是不可能的。
我們從解密過程逆反過來看看:
1、CRC檢驗這一塊修改跳轉?根本毫無意義,因為它已經是最後一步了。你可以修改RAR文件頭的CRC值,你可以將它改得和你用任意密碼解壓出來的文件CRC值一樣,但你的文件根本就不是原來的文件了。可能已經完全面目全非了。所以,對這一過程不可行。CRC校驗本身是不可逆的
2、那麼把判斷提前到壓縮完的數據?
解壓的時候,有沒有什麼來判斷壓縮數據是否正確?壓縮完的數據,有沒有固定的特徵,是否可以做為解壓的判斷,在這一步里,我們也無法找到有效的可用的固定特徵。因為這一步涉及到RAR的壓縮演算法。即使一個源文件,即使你的文件前一部分是完全相同的,只對後面的部分進行改過,那麼壓縮完,數據也是完全一樣的。因為壓縮完的數據首先是一個壓縮表,後面是編碼。文件不一樣,掃描完的壓縮表也不一樣,編碼又是依賴於壓縮表,所以,這里頭找不到壓縮完的數據有任何的固定特徵可以用來判斷的。
不管壓縮數據是什麼樣的,Winrar都一如既往地進行解壓,沒有進行壓縮數據是否有效的判斷。
3、那假如我們破解了AES了泥?
由於AES只依賴於KEY,如果AES演算法被破解了,我們知道了KEY,我們可以解出壓縮完的數據,但是這里有一個問題,還有一個initVector密鑰,用來第一個16位元組塊的異或,你沒有initVector參數,你第一個16位元組塊的數據便無法解得出來。
4、那就只能從第一步Hash的演算法入手
即使你能破解hash,但hash後的結果泥?沒有結果,你怎麼返推密碼。
所以綜上,發現rar的加密是由hash和AES兩種演算法互相牽制,而兩種演算法當前都無法破解,至少目前還沒有辦法秒破。
如何給RAR加密
RAR 和 ZIP 兩種格式均支持加密功能。
若要加密文件,在壓縮之前你必須先指定密碼,或直接在 壓縮文件名和參數 對話框中指定。
在 命令行 模式時使用開關 -p[密碼]。
而在 WinRAR 圖形界面時,要輸入密碼你可以按下 Ctrl+P 或者是在 文件菜單 選擇「設置默認密碼」命令。
另一種方式是單擊 WinRAR 窗口底部左下角的鑰匙圖標。在 壓縮文件名和參數對話框 里的「高級選項」組中按下「設置密碼」按鈕輸入密碼。
和 ZIP 不同,RAR 格式不只允許數據,而且其它的可感知的壓縮文件區域:文件名、大小、屬性、注釋和其它塊都可加密。如果你希望這樣做,你需要在密碼對話框中設置「加密文件名」 選項,或在命令行模式使用 -p[密碼] 的開關 -hp[密碼]。以這種方式加密的文件,如果沒有密碼甚至不可能查看文件列表。
當不再需要的時候,別忘了將輸入的密碼刪除。不然你或許又加密了別的壓縮文件,但卻不希望使用同一組密碼。要刪除密碼時,只需要輸入空字元串來替換原先的密碼,或者先關閉 WinRAR 並重新啟動一次。當有密碼存在時,鑰匙的圖標是紅色的,否則它是黃色的。而且,當你使用密碼開始壓縮操作時,標題欄 壓縮文件名和參數對話框 也會閃爍兩次。
如果你在 壓縮文件名和參數 對話框直接輸入它,你不需要刪除密碼。這不同於其它方式,此類密碼僅在單一壓縮操作有效,並在完成後它會自動刪除。
當解壓加密的文件時,開始操作之前你也可以不需要事先輸入密碼。如果 WinRAR 遇到加密的文件,而解壓之前未先輸入密碼的話,它便會提示用戶輸入密碼。
WinRAR 支持 ZIP 2.0 格式使用私有加密演算法。 RAR 壓縮文件使用更強大的 AES-128 標准加密。如果你需要加密重要的信息,選擇 RAR 壓縮文件格式會比較好一些。為了確實的安全性,密碼長度請最少要 8 個字元。不要使用任何語言的單詞作為密碼,最好是任意的隨機組合字元和數字,並且要注意密碼的大小寫。請記住,如果你遺失你的密碼,你將無法取出加密的文件,就算是 WinRAR 的作者本身也無法解壓加密過的文件。
解壓縮軟體下載:http://www.skycn.com/soft/3475.html
用這個軟體就可解壓打開壓縮包。
⑸ 如何用C語言編寫暴力破解壓縮文件解壓密碼的程序
由於有一個重要的Rar文件,極需解開,首先試用了ARPC,但是解壓的速度極慢,每秒只有30個左右,所以斷了窮舉破解的念頭,卻仍不死心,因為我從不崇尚窮舉破解的方法,除非每秒可以跑幾千萬次的,我或許可以一試,所以決定研究一下Winrar3.x密碼演算法,以期是否可以破解該密碼。查看了網路上的資料,包括看雪FAQ里的回答,都聲稱只能用窮舉法破解,起先並不理解,但通過研究,我理解了看雪前輩們在FAQ里所說的原因,不禁讓我佩服
Winrar加密思路的成熟。雖然研究的結果沒有什麼新意,但我還是決定把我的研究結果與大家一起分享,為那些仍然以為winrar密碼可以象破解注冊碼一樣的,通過修改winrar彈出框之類的更改文件流程指向可以達到跳過密碼檢驗的朋友,做一個簡要的說明。
一、Rar文件生成的流程。
Winrar加密文件時,總的分兩個步驟:
1:先把源文件壓縮,壓成一段數據段。
2:再將壓縮完的數據段加密。
對於同一個源文件來說,不進行加密,壓縮完,其rar文件中的數據段是一模一樣的。但是如果對同一個源文件來說,即使使用同一個密碼,加密完rar文件中的數據段是不一樣的,這是由於加密的密鑰是依賴於一個Salt(8個位元組的密鑰,用來加密時使用,存放在rar文件頭中里)
所以要解密rar加密文件關鍵在於數據解密這一步,那我們接下來研究一下如何加密的。
二、加密「壓縮完的數據段」的流程
1、獲取密鑰:
將明文的密碼與Salt一起,通過HASH演算法,生成兩個16位元組的密鑰。(一個是KEY(AES演算法的參數),一個是initVector)
2、以Key和initVector來加密壓縮數據:
這里,是一個循環加密的結構,每16位元組作為一個塊,進行加密(這可能正是為什麼加密完的文件長度總為16倍數的原因)。加密採用AES演算法(RAR採用的是AES的rijndael的標准應用)。這里注意:AES加密前,有一個異或運算,是先將每16位元組塊與上一個16位元組塊加密結果進行異或,然後再進行AES演算法的。我用一個簡單的示意代碼看說明:
;===============================================
packblock[0]=packblock[i]^initVector
encryptBlock[0]=AES(packblock[0]) ;(KEY為AES的密鑰)
for i=1to 塊數量-1
packblock[i]=packblock[i]^encryptBlock[i-1]
encryptBlock[i]=AES(packblock[i]);(KEY為AES的密鑰)
next
;packblock[i]表示壓縮完的每16位元組數據
;encryptBlock[i]表示加密完的每16位元組數據
;===============================================
三、解密的過程
由於AES演算法是對稱的,所以解密的過程,是加密過程的逆運算。但解密時AES演算法過程與加密所用的不一樣(是因為解密過程中由KEY生成的子密鑰表不一樣)。仍然需要我們將密碼輸入,與salt一起生成兩個16位元組密鑰,KEY和initVector。
;===============================================
packblock[0]=AES1(encryptBlock[0]) ;(KEY為AES的密鑰)
packblock[0]=packblock[i]^initVector
for i=1to 塊數量-1
packblock[i]=AES1(encryptBlock[i]) ;(KEY為AES的密鑰)
packblock[i]=packblock[i]^encryptBlock[i-1]
next
;===============================================
那判斷密碼是否正確的在什麼地方呢?
解密的過程是解密後的數據塊進行解壓縮,然後解成源文件,對該文件進行CRC校驗,存在RAR文件中的源文件CRC校驗碼比較,相同則密碼正確,不相同則密碼錯誤。
四、無法秒破的原因
從上面,我們了解了RAR文件的整體思路。地球人都知道,解密時,肯定有個步驟是來判斷密碼的正確與否。而且,依據以往的經驗,我們也許可以將某些判斷的點移動,那樣可以縮減破解的流程思路。那RAR的這一步在哪裡?它把校驗放在了最後的一步。如果要秒破,我們該怎麼做泥?至少我認為目前是不可能的。
我們從解密過程逆反過來看看:
1、CRC檢驗這一塊修改跳轉?根本毫無意義,因為它已經是最後一步了。你可以修改RAR文件頭的CRC值,你可以將它改得和你用任意密碼解壓出來的文件CRC值一樣,但你的文件根本就不是原來的文件了。可能已經完全面目全非了。所以,對這一過程不可行。CRC校驗本身是不可逆的
2、那麼把判斷提前到壓縮完的數據?
解壓的時候,有沒有什麼來判斷壓縮數據是否正確?壓縮完的數據,有沒有固定的特徵,是否可以做為解壓的判斷,在這一步里,我們也無法找到有效的可用的固定特徵。因為這一步涉及到RAR的壓縮演算法。即使一個源文件,即使你的文件前一部分是完全相同的,只對後面的部分進行改過,那麼壓縮完,數據也是完全一樣的。因為壓縮完的數據首先是一個壓縮表,後面是編碼。文件不一樣,掃描完的壓縮表也不一樣,編碼又是依賴於壓縮表,所以,這里頭找不到壓縮完的數據有任何的固定特徵可以用來判斷的。
不管壓縮數據是什麼樣的,Winrar都一如既往地進行解壓,沒有進行壓縮數據是否有效的判斷。
3、那假如我們破解了AES了泥?
由於AES只依賴於KEY,如果AES演算法被破解了,我們知道了KEY,我們可以解出壓縮完的數據,但是這里有一個問題,還有一個initVector密鑰,用來第一個16位元組塊的異或,你沒有initVector參數,你第一個16位元組塊的數據便無法解得出來。
4、那就只能從第一步Hash的演算法入手
即使你能破解hash,但hash後的結果泥?沒有結果,你怎麼返推密碼。
所以綜上,我發現rar的加密是由hash和AES兩種演算法互相牽制,而兩種演算法當前都無法破解,至少目前還沒有辦法秒破,也理解了看雪高手講的道理。
五、對窮舉提高演算法效率的一些設想。
我用匯編寫完了RAR窮舉解密的演算法模塊,但是如何提高效率,優化窮舉的速度泥?我有如下的想法:
1、從壓縮數據里找尋特徵,省掉解壓縮、CRC檢驗代碼和生成initVector生成代碼。目前,通過多次實驗,我找到的一個特徵(不知道這個是否正確),即解密完的最後一個16位元組塊的最後一個位元組必須為0。因為經過多次的試驗,我發現有加密的數據段長度都會比未加密前的數據長,那麼,最後一個
16個位元組的數據塊解密完,多出的部分就都為0,但多出幾個位元組泥?多次實驗,長度不一,我試想著從加密數據段最後一個16個位元組塊著手,只解這一塊,看是否一個位元組為0,這樣,只解密16個位元組的數據,來大大提高效率?如果能進行到這一步了,再通過解全部數據,進行CRC校驗的判斷。
2、如果第一個特徵不成立的話,針對特定格式的壓縮文件,比如doc、jpg等,部分數據固定,壓縮完的數據是否存在相互牽制的數據?從而把判斷提前,這一步,我不知道如何找到壓縮完的數據是否存在相互牽制的數據。
⑹ C語言程序解答
這個要開個價錢才好
⑺ 壓縮成RAR的TXT。怎麼一次性在壓縮文件里的每本TXT都導入相同的文字
給你一個參考思路:
1.密碼文件的後綴不一定要是TXT的,你可以將:
FileName = App.Path + "\password.txt"
改為任意的不常見的後綴:
FileName = App.Path + "\password.mima"
照樣可以,這是最初級的「加密」形為,因為在WIN中TXT太不經事了
而你改成mima後,一般人就不會用常見軟體打開它了
當然,這種方法必須配合第2點,不然沒用
2.將密碼經過一種加密操作再保存在你的密碼文件中,以下向你提供一個簡單
有效的加密碼代碼,你自己按你的要求修改一下就行了:
Rem 異或操作實現加密和解密
Function code(src() As Byte, key() As Byte) As Byte()
Dim a() As Byte
Dim i As Long
Dim j As Long
Dim k As Long
Dim l As Long
k = UBound(src)
l = UBound(key)
ReDim a(k)
j = 0
For i = 0 To k
a(i) = src(i) Xor key(j)
j = j + 1
If j > l Then j = 0
Next i
code = a
End Function
Private Sub form_click()
Dim a() As Byte
Dim b() As Byte
Dim c() As Byte
a = "用於加密的密碼"
b = "密碼"
Print "加密前的明文:"; a
a = code(a, b) '將原文與密碼進行異或運算,加密
Print "加密後的密文:", a
a = code(a, b) '將密文與密碼進行異或運算,解密
Print "解密後的明文:", a
End Sub
你可以將加密後的密文存放到你的App.Path + "\password.mima"中
這樣便能實現一個初級的加密演算法了!
⑻ 用c#設計壓縮、解葯程序
ZIP格式演算法的介面文件,你需要引用里邊提供的API,你自己寫壓縮文件的演算法是不大可能的!至少目前是不大可能的。。。
而看起來,你思路不是混亂,壓根是不明所以!
看一下這個DLL為你提供的介面,應該就是傳遞一個文件給它,然後他為你打包好一個壓縮文件!具體要看人家的介面是怎麼寫的,找找API的文檔!
⑼ XOR BX什麼意思
XOR BX,BX //對本身進行異或運算,清空寄存器bx
MOV CX,10 //給寄存器cx賦值10
LPP:MOV AH,1 //給寄存器ah賦值1
INT 21H //16進制數21(H表明該數字為16進制數)自減1
MOV AH BH //bh的值賦給ah寄存器
ADD AL,BL //寄存器al加上bl的值結果在al中存放
AAA //不了解,呵呵
MOV BX, AX //ax中的值賦給bx寄存器
LOOP LPP //回到lpp。
素我直言,,,該程序有點問題哦。。
⑽ 加密壓縮文件忘記密碼要怎麼解壓跪求!!
RAR的加密演算法使用的是AES,而舊的RAR的加密演算法是私有的。這兩種演算法都很難破解,所以在沒有密碼的情況下只能用字典暴力破解法來破解。 一、Rar文件生成的流程。 Winrar加密文件時,總的分兩個步驟: 1:先把源文件壓縮,壓成一段數據段。 2:再將壓縮完的數據段加密。 對於同一個源文件來說,不進行加密,壓縮完,其rar文件中的數據段是一模一樣的。但是如果對同一個源文件來說,即使使用同一個密碼,加密完rar文件中的數據段是不一樣的,這是由於加密的密鑰是依賴於一個Salt(8個位元組的密鑰,用來加密時使用,存放在rar文件頭中里) 所以要解密rar加密文件關鍵在於數據解密這一步,那我們接下來研究一下如何加密的。 二、加密「壓縮完的數據段」的流程 1、獲取密鑰: 將明文的密碼與Salt一起,通過HASH演算法,生成兩個16位元組的密鑰。(一個是KEY(AES演算法的參數),一個是initVector) 2、以Key和initVector來加密壓縮數據: 這里,是一個循環加密的結構,每16位元組作為一個塊,進行加密(這可能正是為什麼加密完的文件長度總為16倍數的原因)。加密採用AES演算法(RAR採用的是AES的rijndael的標准應用)。這里注意:AES加密前,有一個異或運算,是先將每16位元組塊與上一個16位元組塊加密結果進行異或,然後再進行AES演算法的。我用一個簡單的示意代碼看說明: ;=============================================== packblock[0]=packblock^initVector encryptBlock[0]=AES(packblock[0]) ;(KEY為AES的密鑰) for i=1 to 塊數量-1 packblock=packblock^encryptBlock[i-1] encryptBlock=AES(packblock) ;(KEY為AES的密鑰) next ;packblock表示壓縮完的每16位元組數據 ;encryptBlock表示加密完的每16位元組數據 ;=============================================== 三、解密的過程 由於AES演算法是對稱的,所以解密的過程,是加密過程的逆運算。但解密時AES演算法過程與加密所用的不一樣(是因為解密過程中由KEY生成的子密鑰表不一樣)。仍然需要我們將密碼輸入,與salt一起生成兩個16位元組密鑰,KEY和initVector。 ;=============================================== packblock[0]=AES1(encryptBlock[0]) ;(KEY為AES的密鑰) packblock[0]=packblock^initVector for i=1 to 塊數量-1 packblock=AES1(encryptBlock) ;(KEY為AES的密鑰) packblock=packblock^encryptBlock[i-1] next ;=============================================== 那判斷密碼是否正確的在什麼地方呢? 解密的過程是解密後的數據塊進行解壓縮,然後解成源文件,對該文件進行CRC校驗,存在RAR文件中的源文件CRC校驗碼比較,相同則密碼正確,不相同則密碼錯誤。 四、無法秒破的原因 從上面,我們了解了RAR文件的整體思路。地球人都知道,解密時,肯定有個步驟是來判斷密碼的正確與否。而且,依據以往的經驗,我們也許可以將某些判斷的點移動,那樣可以縮減破解的流程思路。那RAR的這一步在哪裡?它把校驗放在了最後的一步。如果要秒破,我們該怎麼做泥?至少我認為目前是不可能的。 我們從解密過程逆反過來看看: 1、CRC檢驗這一塊修改跳轉?根本毫無意義,因為它已經是最後一步了。你可以修改RAR文件頭的CRC值,你可以將它改得和你用任意密碼解壓出來的文件CRC值一樣,但你的文件根本就不是原來的文件了。可能已經完全面目全非了。所以,對這一過程不可行。CRC校驗本身是不可逆的 2、那麼把判斷提前到壓縮完的數據? 解壓的時候,有沒有什麼來判斷壓縮數據是否正確?壓縮完的數據,有沒有固定的特徵,是否可以做為解壓的判斷,在這一步里,我們也無法找到有效的可用的固定特徵。因為這一步涉及到RAR的壓縮演算法。即使一個源文件,即使你的文件前一部分是完全相同的,只對後面的部分進行改過,那麼壓縮完,數據也是完全一樣的。因為壓縮完的數據首先是一個壓縮表,後面是編碼。文件不一樣,掃描完的壓縮表也不一樣,編碼又是依賴於壓縮表,所以,這里頭找不到壓縮完的數據有任何的固定特徵可以用來判斷的。 不管壓縮數據是什麼樣的,Winrar都一如既往地進行解壓,沒有進行壓縮數據是否有效的判斷。 3、那假如我們破解了AES了泥? 由於AES只依賴於KEY,如果AES演算法被破解了,我們知道了KEY,我們可以解出壓縮完的數據,但是這里有一個問題,還有一個initVector密鑰,用來第一個16位元組塊的異或,你沒有initVector參數,你第一個16位元組塊的數據便無法解得出來。 4、那就只能從第一步Hash的演算法入手 即使你能破解hash,但hash後的結果泥?沒有結果,你怎麼返推密碼。 所以綜上,發現rar的加密是由hash和AES兩種演算法互相牽制,而兩種演算法當前都無法破解,至少目前還沒有辦法秒破。 所以如果擅長電腦就試試字典破解(字典是指一個包含很多密碼的txt文件,黑客常用相關軟體生成包含很多密碼的字典文件,然後用軟體把字典中的密碼去不斷嘗試登陸,直到登陸成功)吧 祝你好運
採納哦