Kleiner CPU-AES-Bench

Helle53

Lt. Commander
Mitglied seit
16.12.2011
Beiträge
122
Renomée
13
Für AES-Benchs (CPU-Unterstützung AES-NI) habe ich nicht das gefunden, was mich interessiert. Einschlägige Programme testen offensichtlich immer im ECB-Modus, der aber nicht das Gelbe vom Ei ist (s. http://de.wikipedia.org/wiki/Electronic_Code_Book_Mode) und http://de.wikipedia.org/wiki/Cipher_Block_Chaining_Mode. ECB lässt sich wunderbar paralellisieren (CBC nicht) und so sind die Messwerte natürlich phantastisch, sagt aber deshalb meiner Meinung nach zu wenig über die direkten CPU-AES-Fähigkeiten aus. Deshalb habe ich für AES-CBC ein kleines Test-Programm geschrieben. Benötigt wird eine CPU mit AES-NI-Unterstützung und ein 64-Bit-OS. Um keinen HD-Einfluss zu haben läuft das Ganze nur im RAM und ist festgepinnt auf Core0. Es wird eine 256 MB große "Ursprungs"-Datei erstellt (der Plain-oder Klar-Text), diese Datei wird in weitere 256 MB encodiert und dann in nochmal weitere 256 MB decodiert. Anschließend wird die decodierte Datei mit der Ursprungs-Datei verglichen (Datei immer im Sinne von Bytes). Um maximale AES-Durchläufe zu haben wird eine Schlüssellänge von 256-Bit verwendet.
Die Download-Datei (ZIP) enthält die EXE und den Quellcode (FASM): http://www.mdcc-fun.de/k.helbing/AES/AES.zip.
Meine Werte für i7-3770K (RAM DDR3/1333):
- 4.1GHZ: Encodierung = 491ms (521MB/s); Decodierung = 133ms (1924MB/s)
- 3.5GHZ: Encodierung = 574ms (445MB/s); Decodierung = 154ms (1662MB/s)
Wäre nett, wenn es jemand testen würde.
Danke!
Helle
 
7-zip kann auch AES-CBC, wäre also für Vergleichswerte auch interessant.
 
@Hitcher:
Ziel war es nicht Programme mit mehr oder weniger AES-Nutzung (Anteil) zu testen, sondern möglichst direkt die Hardware-AES-Performance der CPU. Natürlich verwenden div. Programme AES, sehr bekannt ist z.B. TrueCrypt (nutzt übrigens den XTS-Mode, den "Quasi-Standard" für Datenträger). Aus Benchmarks dieser Programme lässt sich aber kaum der AES-Anteil der CPU ermitteln.
Da ich schon wieder den Begriff "Mode" verwende, hier für diejenigen, die sich noch nicht weiter mit AES beschäftigt haben, eine kurze Erläuterung (soll kein Klugscheißen sein :) !): AES ist ein Encrypt-Decrypt-Algorithmus (gut, dass ist bekannt), der immer genau 16 Bytes (=1 Block) verarbeitet. Will man z.B. 160 Bytes verschlüsseln, muss im Programm die AES-Funktion eben 10-mal aufgerufen werden. Hier kommt jetzt der Mode ins Spiel. Am einfachsten ist es, 16 Bytes einzulesen, verschlüsseln und diese 16 Bytes in die Ziel-Datei zu schreiben, dann die nächsten 16 Bytes usw. So macht es der ECB-Mode, der sich so prima paralellisieren lässt; das Ergebnis ist aber, 16 gleiche Eingang-Bytes ergeben immer 16 gleiche Ausgang-Bytes. Dies lässt aber durchaus Rückschlüsse auf die Original-Datei zu (s. den Tux-Umriss in o.g. Link). Besser ist der CBC-Mode: Die ersten 16 Eingang-Bytes werden mit dem sogenannten Initialisierungsvektor (16 Bytes) verknüpft und die 16 Ausgang-Bytes werden mit den nächsten 16 Eingang-Bytes verknüpft usw. So ergeben auch gleiche Eingangs-Blöcke immer andere Ausgangsblöcke. Nachteil: Nix mehr mit prima Paralellisierung, dafür aber wesentlich sicherer.
 
Anhang anzeigen 26285
Habe es mal mit nem Sandy 2600K@4.5 Ghz, Win 7 64bit, 16 Gb DDR3-1600 laufen lassen.
 
ja, leider habe ich hier keine CPU mit Intel AES-NI, aber eine Notebook Dualcore-CPU T6670 mit 2x2GB DDR2-800 RAM, also ein eher älteres Teil, daher läuft das mit dem Benchmark leider nicht.

Aber 7-zip kann wie gesagt Dateien auch AES-256 CBC verschlüsseln, dann allerdings kann man nicht 2 Kerne zuweisen. Wenn man die Komprimierung deaktiviert, müsste der AES-Anteil von User-Time annhähernd 100% sein. Unten angefügt noch die Erstellung eines sehr kleinen Archives wo nur 2kB verschlüsselt werden; diese Zeit kann man noch abziehen für ein genaueres Ergebnis (die Zeit für das salzen + hashen des Schlüssels entfällt dann wohl).

Also als Vergleichswert evtl. trotzdem interessant:
http://666kb.com/i/c7u51hd4zb75lfs4u.png
http://666kb.com/i/c7u52emj12rquju3y.png
Verschlüsselt habe ich eine 256MiB Testdatei aus HEX Zufallszahlen, damit das Ergebnis vergleichbar ist, die CPU sollte bei Last auf nur einem Kern auf 2,3 GHz hochtakten.
Das Ausgabelaufwerk war eine RAM-Disk mit 1GB, die Quelldatei lag schon im Filecache.

F:\>timer "c:\Program Files\7-Zip\7z.exe" a -t7z -m0=copy -pHeinzOtto2 randfil
e-aes.7z d:\randfile

Timer 3.01 Copyright (c) 2002-2003 Igor Pavlov 2003-07-10

7-Zip [64] 9.22 beta Copyright (c) 1999-2011 Igor Pavlov 2011-04-18
Scanning

Creating archive randfile-aes.7z

Compressing randfile

Everything is Ok

Kernel Time = 0.592 = 00:00:00.592 = 16%
User Time = 3.198 = 00:00:03.198 = 88%
Process Time = 3.790 = 00:00:03.790 = 104%
Global Time = 3.619 = 00:00:03.619 = 100%

F:\>"c:\Program Files\7-Zip\7z.exe" l randfile-aes.7z

7-Zip [64] 9.22 beta Copyright (c) 1999-2011 Igor Pavlov 2011-04-18

Listing archive: randfile-aes.7z

--
Path = randfile-aes.7z
Type = 7z
Method = Copy 7zAES
Solid = -
Blocks = 1
Physical Size = 268435591
Headers Size = 135

Date Time Attr Size Compressed Name
------------------- ----- ------------ ------------ ------------------------
2012-10-04 19:02:16 ....A 268435456 268435456 randfile
------------------- ----- ------------ ------------ ------------------------
268435456 268435456 1 files, 0 folders


F:\>timer "c:\Program Files\7-Zip\7z.exe" t -pHeinzOtto2 randfile-aes.7z

Timer 3.01 Copyright (c) 2002-2003 Igor Pavlov 2003-07-10

7-Zip [64] 9.22 beta Copyright (c) 1999-2011 Igor Pavlov 2011-04-18

Processing archive: randfile-aes.7z

Testing randfile

Everything is Ok

Size: 268435456
Compressed: 268435591

Kernel Time = 0.124 = 00:00:00.124 = 3%
User Time = 3.229 = 00:00:03.229 = 97%
Process Time = 3.354 = 00:00:03.354 = 100%
Global Time = 3.323 = 00:00:03.323 = 100%
---


F:\>timer "c:\Program Files\7-Zip\7z.exe" a -t7z -m0=copy -pHeinzOtto2 test.7z d
:\readme.txt

Timer 3.01 Copyright (c) 2002-2003 Igor Pavlov 2003-07-10

7-Zip [64] 9.22 beta Copyright (c) 1999-2011 Igor Pavlov 2011-04-18
Scanning

Creating archive test.7z

Compressing readme.txt

Everything is Ok

Kernel Time = 0.015 = 00:00:00.015 = 3%
User Time = 0.390 = 00:00:00.390 = 89%
Process Time = 0.405 = 00:00:00.405 = 92%
Global Time = 0.437 = 00:00:00.437 = 100%

F:\>timer "c:\Program Files\7-Zip\7z.exe" t -t7z -m0=copy -pHeinzOtto2 test.7z

Timer 3.01 Copyright (c) 2002-2003 Igor Pavlov 2003-07-10

7-Zip [64] 9.22 beta Copyright (c) 1999-2011 Igor Pavlov 2011-04-18

Processing archive: test.7z

Testing readme.txt

Everything is Ok

Size: 2489
Compressed: 2626

Kernel Time = 0.000 = 00:00:00.000 = 0%
User Time = 0.296 = 00:00:00.296 = 82%
Process Time = 0.296 = 00:00:00.296 = 82%
Global Time = 0.359 = 00:00:00.359 = 100%

Zeit UserTime für Verschlüsselung 256MiB 7z: 3.198 - 0.39 = 2.81s => 91 MiB/s
Zeit UserTime für Entschlüsselung 256MiB 7z: 3.229 - 0.296 = 2.93s => 87 MiB/s



---
edit:
unter Linux x64 (Fedora 17) mit openssl läuft es sogar noch schneller:

[xyz@xxx tmp]$ time openssl enc -aes-256-cbc -e -in ./randfile -out ./randfile-aes -pass pass:OttoHugo3

real 0m3.036s
user 0m2.384s
sys 0m0.632s

[xyz@xxx tmp]$ time openssl enc -aes-256-cbc -d -in ./randfile-aes -out ./randfile-dec -pass pass:OttoHugo3

real 0m4.142s
user 0m2.628s
sys 0m0.532s
 
Zuletzt bearbeitet:
unbenannt6dr41.png


tja ?
 
Zurück
Oben Unten