2013-05-30 38 views
1

我想要加載具有如何閱讀hex文件下載到numpy的陣列

1)初始化值(IV)在第一行,
2)在第二行encrption鍵,
下面的十六進制文件 3)數第三行明文的,並且在密碼塊鏈接(CBC)模式

成numpy的陣列,用於AES加密
4)實際明文。

6bce1cb8d64153f82570751b6653c943 
b15a65475a91774a45106fbc28f0df70 
10 
f493befb2dcad5118d523a4a4bf4a504 
54fc4e0a82ae8dc56cc7befc9994b79d 
878d287647b457fd95d40691b6e0c8ab 
dc0adc16665eb96a15d3257752ae67dc 
8cda3b8f23d38e9240b9a89587f69970 
e06301763146c1bac24619e61015f481 
c19def2f12e5707d89539e18ad104937 
048d734a1a36d4346edc7ceda07ff171 
5e621ce0a570478c1c2ec3e557ca3e0d 
e55c57b119ff922b7f87db0ead2006cd 

如果文件的一致性打擾了你,你可以忽略第三行,它告訴要加密的純文本的數量。除第三行之外的所有行都是128位十六進制條目

想法是將此文件加載到numpy陣列中,然後高效地執行AES加密。

我怎樣才能加載到numpy數組,然後使用AES從Crypto.Cipher做這個文件和類似文件的AES加密。我有這種格式的文件有超過1億個純文本。

感謝,並請讓我知道,如果你有我假設你想unhexlify數據有任何疑問

+2

您確定將1.6GB數據加載到內存中的一個巨陣中,並且在加載和預處理(去六進制化)完成之前不進行任何處理,會比反覆處理它更快嗎? – abarnert

+4

爲什麼你要加載到一個numpy數組?這不會讓'Crypto.Cipher.AES'更快,我不應該這麼想。 – DSM

+0

這是否使得它更快,是我想看到的。可能是這樣嗎?誰知道 ?所以最好檢查一下 – user2065276

回答

4

,並存儲所產生的字節串爲固定長度的字符串,而不是object。 (你不能將它們存儲爲int128類型的一些類型,因爲numpy沒有這種類型。)

爲避免將3.2GB的文本讀入內存,並使用大致相同的數量將其預處理爲所需的表格,你可能想使用fromiter,所以:

with open(myfile) as f: 
    iv = binascii.unhexlify(f.readline().strip()) 
    key = binascii.unhexlify(f.readline().strip()) 
    count = int(f.readline()) 
    a = np.fromiter((binascii.unhexlify(line.strip()) for line in f), dtype='|S16') 

如果你的RAM不遺餘力10GB(粗略大概的猜測),它可能更快讀取整個事情的arrayobject,然後轉換兩次......但我懷疑它。


至於這是否會幫助......你可能會得到一點好處,因爲AES-ING 16個字節可以足夠快迭代的成本是顯着的。讓我們測試一下,看看。

使用64位Mac Python 2.7.2,我通過重複複製您的示例創建了一個100000個S16的數組。然後:

In [514]: %timeit [aes.encrypt(x) for x in a] 
10 loops, best of 3: 166 ms per loop 
In [515]: %timeit np.vectorize(aes.encrypt)(a) 
10 loops, best of 3: 126 ms per loop 

因此,這幾乎節省了25%。不錯。

當然,數組的構建需要比僅僅將迭代器放在首位的時間更長 - 但即使考慮到這一點,仍然會有9%的性能提升。在您的使用案例中,以1.6%的速度提高9%可能是合理的。

請記住,我只是從一個預先存在的100K列表中構建一個100K對象的數組;有100M的對象從磁盤上讀取數據,I/O可能會成爲一個嚴重的因素,而迭代處理(這可以使CPU成本與磁盤等待交錯)很可能會做得更好。

換句話說,您需要使用自己的真實數據和場景進行測試。但你已經知道了。


對於更寬多種實現方式,用簡單的穿孔 - 測試支架,見this pastebin

您可能想嘗試組合不同的方法。例如,您可以使用來自itertoolsgrouper配方將物料分批處理成一次32K的明文,然後使用numpy處理每個批次,以獲得最好的效果。然後pool.imap表示numpy處理,以獲得最好的3.或者,或者,將一個大的numpy數組放入共享內存中,並使每個多處理任務處理成爲該數組的一部分。

+0

我有8GB內存。所以不要擔心 – user2065276

+3

@ user2065276:如果你有8GB的內存,使用3.2GB的文件,至少3.2GB的中間存儲空間,以及1.6GB的最終結果將交換到磁盤,所以你非常絕對不應該擔心。 – abarnert

+0

感謝一百萬。你太好了! – user2065276