2016-02-13 29 views
2

我重新寫一個加密/壓縮庫,現在看來似乎越來越成爲每個處理的字節進行大量的處理。我寧願選擇加密可以去哪幾種有限的方式(正確的方法)時使用枚舉類型,但是當這些路徑成爲週期性的,我必須添加額外的代碼來測試type'last和type'first。我總是可以爲這個類型寫一個這樣的條件,或者給函數的類型賦一個加法/減法運算符來包裝結果,但這是更多的代碼和處理,當它必須每八字節以及其他一切。有沒有一種方法,使約高效,好像它是一個簡單的「國防部」式的操作,如在Ada中,是否有一種方法可以使枚舉類型像模數類型一樣工作 - 在最後一個範圍之後將其包裝爲0?

type Modular is mod 64 ....; 
for ......; 
pragma ....; 
type Frequency_Counter is array(Modular) of Long_Integer; 
Head : Modular := (others => 0); 
Freq : Frequency_Counter(Size) := (others => 0); 
Encryption_Label : Modular := Hash3; 
Block_Sample : Modular := Hash5; 
... 
Hash3 := Hash3 + 1; 
Freq (Hash3):= Freq(Hash3) + 1; -- Here is where my made-on-the-fly example is focused 

我想我可以使整個算法更高效,使用枚舉類型,如果我可以得到枚舉類型在處理器中以與mod類型數學相同的週期數進行數學運算。我在思考方式時有點創意,但他們顯然不適合我以任何方式作爲例子。我能想到的唯一可能超出我的技能,並且正在使用內聯ASM(氣體彙編語言語法)使得操作對處理器非常直接。

PS:我知道這是一個小的增益,獨自一人。任何收益都適用於該應用程序。

+1

改寫加密庫時要小心。一些低效率是故意的,以減輕旁道攻擊。話雖如此,提高加密性能的奇特方法是利用[AES指令集](https://en.wikipedia.org/wiki/AES_instruction_set)。這往往會提供5倍或更高的性能提升。 – Brian

+0

我很欣賞這個警告,儘管我很謙虛,因爲我沒有受到足夠的教育以防止他們通過旁道攻擊,但是,我認爲風險很低,因爲沒有鑰匙直接存儲在庫中 - 它們在輸入時直接轉換到解釋值的緩衝塊,其在至少兩個循環操作中使用。使用平臺並不都支持AES指令集。感謝您的幫助:) –

+0

這不足以防止定時攻擊。也就是說,當加密是客戶端而不是服務器端時,許多此類攻擊變得不那麼重要。另一個擔心是無意中削弱了加密。這不能通過像單元測試這樣的東西來輕易檢測到; AES的弱化形式仍然與AES的適當實現(例如,破壞的RNG)完全兼容。 – Brian

回答

5

不知道它會帶來多大的改變!

鑑於這種

package Cyclic is 

    type Enum is (A, B, C, D, E); 
    type Modular is mod 5; 

    function Next_Enum (En : Enum) return Enum is 
    (if En = Enum'Last then Enum'First else Enum'Succ (En))        --' 
    with Inline_Always; 

end Cyclic; 

with Cyclic; use Cyclic; 
procedure Cyclic_Use (N : Natural; E : in out Enum; M : in out Modular) is 
begin 

    begin 
     for J in 1 .. N loop 
     E := Next_Enum (E); 
     end loop; 
    end; 

    begin 
     for J in 1 .. N loop 
     M := M + 1; 
     end loop; 
    end; 

end Cyclic_Use; 

和使用GCC 5.2.0與-O3(gnatmake -O3 -c -u -f cyclic_use.adb -cargs -S),對於兩個循環產生的x86_64的彙編是

(枚舉編譯)

L3: 
     leal 1(%rsi), %ecx 
     addl $1, %eax 
     cmpb $4, %sil 
     cmove %r8d, %ecx 
     cmpl %eax, %edi 
     movl %ecx, %esi 
     jne  L3 

(模塊化)

L4: 
     leal -4(%rdx), %ecx 
     addl $1, %eax 
     cmpb $3, %dl 
     leal 1(%rdx), %r8d 
     movl %ecx, %edx 
     cmovle %r8d, %edx 
     cmpl %eax, %edi 
     jne  L4 

我不假裝知道x86_64的彙編,我不知道爲什麼枚舉版本進行比較對4,而模塊化的版本進行比較對3,但這些看起來非常相似,我!但枚舉的版本是一個指令短...

+0

我沒有意識到我可以使用GCC來生成ASM。有了ASM的參考手冊和這個輸出,我應該能夠弄清楚這一點。實際上,我看到枚舉ASM實際上比模塊更短,我感到有些驚訝。正如我十五年前學習ASM時所記得的那樣,每條指令(除了某些宏)都代表一條指令調用處理器,因此使用相關的週期。由於這個原因,我的錯誤已經被發現並且生成的代碼的減少得到了解決,所以我將這個答案標記爲......謝謝! –

+0

GCC總是(嗯,我想是這樣)生成彙編器。只是它通常會被拋棄,留下目標代碼。 '-S'保留它。 –

相關問題