Etikettarkiv: Python

Matasanos kryptoutmaningar

Det få sätt att effektivt lära sig saker som att faktisk sätta sig ner och praktiskt utföra, öva på den man vill lära sig. Det gäller både saker som kanske är tråkiga, exempelvis glosor på tyska och saker som är desto roligare – spela gitarr eller hacka krypton.

Säkerhetsföretaget Matasano Security har insett detta och har därför skapat en serie spännande krypto och IT-säkerhetsutmaningar. Utmaningarna skickas som mail innehållandes åtta olika problem. Totalt finns sex uppsättningar problem. Problemen sträcker sig från grundläggande kodningar och XOR-krypton till slumptalsgeneratorer, strömkrypton, nyckelsystem och mycket mer. Själva utmaningarna är inte problem avsedda att luras, utan bygger på faktiska attacker och svagheter.

Matasano Security

Jag har precis börjat arbeta mig igenom utmaningarna. För att göra det lite svårare för mig själv försöker jag dessutom implementera mina lösningar inte bara i Python och/eller C, utan även i SystemVerilog. Vi får se hur länge det är realistiskt att göra det. Att implementera RSA i hårdvara kräver en hel del arbete – troligen mer än att lösa själva problemen i utmaningarna. Så här långt har det varit både givande och väldigt roligt.

För mer information om utmaningarna och hur du anmäler dig (du skickar ett mail), se Matasanos sida om utmaningarna. Om du genomför samtliga 48 utmaningar lovar Matasano även att donera 20 USD till välgörande ändamål.

Här finns även en sida skriven av en person som genomfört samtliga utmaningar och berättar lite mer om dom. En krav från Matasano är dock att inte ge beskriva utmaningarna i detalj eller dela med sig av sina lösningar, just för att andra också ska få chansen.

Lästips inför helgen: Think Complexity

För dig som är nyfiken på programspråket Python finns en bra bok kallad Python for Software Design, mer känd under namnet How to Think Like a Computer Scientist.

Boken Python for Software Design.

Tillsammans med Mark Pilgrims Dive Into Python och Dive Into Python3 [1] är den boken nog den bästa Pythonboken på nätet. (Dive Into Python är boken som verkligen fick mig att fastna för Python. Jag läste den över en natt och blev otroligt inspirerad av att börja använda Python. Något jag inte ångrat.)

Författaren till Python for Software Design, har nu gjort en till bok tillgänglig på nätet – Think Complexity.

Think Complexity

Den nya boken handlar inte om Python i sig, utan om algoritmer och datastrukturer. Sökträd, databaser, grafer m.m. och det viktigaste – hur olika algoritmer skalar med storleken på problemet dom används för att lösa. Detta brukar kallas för beräkningsmässig komplexitet, eller bara komplexitet.

Jag har hunnit läsa delar av boken och tycker att den är väl värd att lösa. Samtidigt är det intressant att se hur datastrukturer och algoritmer som arbetar på strukturerna fortfarande är viktiga. Moderna språk som Ruby och Python inkluderar kraftfulla datastrukturer som hashtabeller, listor, databaser som fundamentala datatyper. Och det finns, hävdar jag (det är i alla fall min observation) en tendens att utvecklarna använder de verktyg som finns till buds istället för att fundera igenom vad applikationen/problemet kräver. I de flesta fall blir det dessutom tillräckligt bra och går fort (fortare) att få till en lösning med de inbyggda typerna.

Men genom att känna till andra strukturer – vilka problem dom är bra för att lösa och även hur man kan implementera strukturerna kan verktygslådan utökas. I fallet med Python kan det även vara bra att veta att många datastrukturer finns i Pythons extensiva standardbibliotek. Använder du Python och inte grävt runt i biblioteket har du gjort dig själv en otjänst, det finns otroligt mycket bra att lyfta in i din applikation med ett enkelt import-kommando.

Läs, lär och ha en trevlig helg!
(JoachimS)

Fotnot [1]: Mark Pilgrim har skrivit flera bra böcker i sin Dive Into-serie, bland annat om HTML5 – böcker Mark dessutom gjorde tillgängliga på nätet. I oktober förra året valde Mark plötsligt att ta bort sig själv och sina alster från nätet. Många undrade vad som hänt och ringde även polisen som lyckades hitta Mark välbehållen. Han hade helt enkelt bestämt sig för att han haft nog med Internet. Det finns ett antal speglingar av böckerna, vilket gör att dom ändå går att läsa. Och detta är i linje med de licensvillkor Mark hade satt på sina verk varför jag väljer att peka på dom.

SSH-klient i webbläsaren och bra dokumentation för OpenSSL

Secure Shell (SSH) är ett protokoll för säker anslutning mot datorer över Internet. SSH är även namnet på den terminalapplikation som implementerar protokollet för att ge interaktiv, säker access. SSH används ofta för att tunnla andra protokoll. Bilden nedan visar hur SSH används för att tunnla X11-protkollet så att fönster på fjärrmaskinen visas på den lokala maskinen.

SSH som tunnlar X11-protokollet.

Det finns även flera andra applikationer som implementerar ssh-protokollet. Ofta byggs dessa på bibliotek som libssh2.

Gate one är en implementation av en SSH-klient skriven i HTML5 som körs direkt i webbläsaren. Gate One. Några fördelar med Gate One enligt dess webbplats är:

  • No browser plugins required!
  • Supports multiple simultaneous terminal sessions. As many as your hardware can handle.
  • Users can re-connect to their running terminals whenever they like from anywhere.
  • Can be embedded into other applications.
  • Includes powerful plugin system that supports plugins written in Python, JavaScript, and even CSS (yes, you can write a CSS-only plugin).
  • The Gate One server can be stopped & started without users losing their running terminal applications (even SSH sessions stay connected!). In essence, worry-free upgrades!
  • The SSH plugin allows users to duplicate sessions without having to re-enter their username and password (it re-uses the existing SSH tunnel).
  • Provides users with the ability to play back and save/share their terminal sessions via a self-contained HTML playback file.
  • Similarly, supports server-side logging, recording, and video-like playback of user sessions.
  • It can even log to syslog to support whatever centralized logging system you want.
  • Keberos-based Single Sign-on support is included. It even works with Active Directory. Other authentication options are available as well.

Det finns ingen testsida för Gate One, däremot en demofilm på Vimeo:

Gate One Beta Demo from Dan McDougall on Vimeo.

Gate One är ett exmpel på hur webbläsaren allt mer blir en ersättning för det lokala datorskrivbordet och den grafiska miljön. Men även om Gate One inte beror av några plugins utan bara websockets krävs det en del på serversidan för att få det hela att snurra. Dokumentationen för Gate One beskriver mer om vad som krävs för att sätta upp Gate One som terminalgränssnitt för din webbtjänst.

Ett bibliotek som Gate One använder är OpenSSL (via Python-wrapperns PyOpenSSL.

OpenSSL och dess underliggande bibliotek libssl är en mycket kraftfull verktyslåda som används i applikationer för att skapa säker kommunikation, som implementation av specifika algoritmer (krypto, hashfunktioner, protokoll) samt för som interaktivt verktyg. Behöver du på något sätt arbeta med säkerhet är det en stark rekommendation att lära dig mer om OpenSSL.

En bra start för detta kan vara den här användarhjälpen (HOWTO) som visar hur du kan lösa specifika problem med OpenSSL. Bra, tydlig och klart läsvärd.

Libmich – ett bibliotek för att generera och analysera mobiltrafik

Sprang i dag på ett Pythonbibliotek kallat libmich. Likt mitt gamla favoritbibliotek ScaPy är libmich avsett att sätta ihop och plocka isär trafik i olika lager. Det som gör libmich speciellt är att det är inriktat på mobiltrafik.

Basen i libmich är ett antal formatklasser som går att använda för att generera eller konsumera olika typer av trafik. Just nu finns det bland annat stöd för EAP, L3GSM Resource Records, SIGTRAN m.m. Libmich har utvecklats av Benoit Michau på France Telecom och libmich är GPLv2-licensierat.

Jag ser att libmich är användbart på flera sätt. Vid utveckling där man behöver förstå hur trafiken hänger ihop och ser ut. Vid verfiering för att skapa mer eller mindre korrekt trafik samt för att sedan kunna analysera trafik från annan utrustning.

Jakten på den fungerande kryptoimplementationen

Jag fick för en dryg vecka sedan skäl att börja arbeta med på en hårdvaruimplementation av blockkryptot CAST. Mer exakt CAST5 med stöd för 40, 80 och 128 bitars nyckel. Den referensdokumentation som finns för CAST är RFC 2144.

RFC:n innehåller tack och lov testvektorer. Men, vilket tyvärr är vädligt vanligt i kryptospecar brister det i entydighet. I fallet RFC 2144 är saker som bitordning på orden och nycklar mindre exakt specat. Det går att gissa, men hade underlättat om det var tydligare. Och det är nu en referensmodell är så värdefull.

Nu finns det ingen utpekad officiell referensmodell att hämta hem. Då är nästa steg att hitta en implementation, helst en som används och går att lita på fungerar. Tyvärr är kryptoimplementationer vanligen optimerade för prestanda med utrullade loopar, inline-assembler och andra trick som gör att dom strukturmässigt kan skilja rätt mycket mot specifikationen.

Sökning på nätet ger att Bruce Schneier har några stycken implementationer av CAST på den CD som följde med hans gamla bibel Applied Cryptography. Jag började titta på implementationen CAST-BAR (zipfil) och jösses.

Bibeln.
Bruce Schneiers stora röda. En bibel för kryptonörden. I dag ersatt av Cryptography Engineering.

Applied Cryptography är gammal, och CAST är ännu äldre (RFC 2144 är från 1997). Och koden i CAST-BAR har knappast åldrats med grace. Men det är faktiskt värre än så – den kan aldrig ha fungerat.

CAST är ett blockkrypto med en struktur som kallas SP-nät och är ett (balanserat) Feistel-krypto. Figuren nedan visar hur iterationen i CAST är uppbyggd:

Iterationen i CAST.

Notera speciellt de fyra lådorna märkta S-box1, …, S-box4. Dessa lådor innehåller de utbytestabeller (S-box) som ger olinjäriteten i CAST. Det finns fyra olika fixa S-boxar i CASTs iteration. Vidare finns det ytterligare fyra andra fixa (dvs med fixt innehåll, ej nyckel eller databeroende) S-boxar som del av kryptots nyckelexpansion. Totalt åtta tabeller om 256 stycken 32-bitars ord vilket kräver 8 kByte ROM-minne. Tabellerna finns listade i appendix A i RFC:n. Men i CAST-BAR finns inga tabeller.

Det som finns är en deklaration #include "cast_tab.h" som uppenbarligen pekar ut en fil där tabellerna skulle vara deklarerade. Men ingen sådan fil finns med i ZIP-filen. Nu var det inte jättesvårt att skapa sig en sådan fil med tabellerna och försöka bygga kryptot. Då kom nästa problem.

Jag kör som standard med den lysande kompilatorn clang (och llvm). Den hostade rejält på ett antal saker i koden. Inga speciellt allvarliga utifrån ett syntax-perspektiv. Men det det är uppenbart att C har blivit mycket striktare och (likt det jag efterfrågar från kryptospecar) mer entydigt. Koden i CAST-BAR är långt ifrån C99. Det gick dock bra att putsa till koden och få den att bygga (utan varningar). Dags att provköra:

js@snabbis>./cast
usage: cast [ n | -x | -y ]
n (integer) will encrypt n times (useful for timing tests)
-x will test the code by encrypting once (and print out the reference vector)
and then run the 1000000 iteration Full Maintenance Test (with reference output)
-y will test the code by encrypting once (and print out the reference vector)
and then run a shortened 1000 iteration Partial Maintenance Test (with reference output)
( which is more convenient for debugging than the Full test
This code is an implementation of CAST-128

js@snabbis>./cast -y
key is: 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9a

Segmentation fault

Oops.
Test i debuggern visar att programmet hoppar rätt ut i skogen pekarmässigt. Lite koll på typer visar att det förutsätts implicit en massa storlekar som inte alls stämmer på en system med 64-bitars arkitektur. Jag testar att flytta koden till min utvecklingsmaskin sbox som kör 32-bit GNU/Linux. Och där fungerar det.

Dags att städa upp i typträsket. Jag gillar stdint.h. Den gör det entydigt vad man verkligen vill ha och kan vara (hyggligt) säker på att det man deklarerar stämmer på olika plattformar. En stunds arbete med att byta ut long int, unsigned char etc mot uint32_t, uint8_t etc och sedan är det dags för nytt försök på min 64-bitsmaskin:

js@snabbis>./cast -y
key is: 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9a

Single Key-Plaintext-Ciphertext Test:
plaintext is: 01 23 45 67 89 ab cd ef
iter = 1
ciphertext is: 23 8b 4f e5 84 7e 44 b2
ref text is: 23 8b 4f e5 84 7e 44 b2
after decryption:
ciphertext is: 01 23 45 67 89 ab cd ef

Partial Maintenance Test (only 1000 iterations):
key is: 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9a

a is: 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9a
b is: 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9a
a is: 23 f7 3b 14 b0 2a 2a d7 df b9 f2 c3 56 44 79 8d
ref a is: 23 f7 3b 14 b0 2a 2a d7 df b9 f2 c3 56 44 79 8d

b is: e5 bf 37 ef f1 4c 45 6a 40 b2 1c e3 69 37 0a 9f
ref b is: e5 bf 37 ef f1 4c 45 6a 40 b2 1c e3 69 37 0a 9f

Sådär. En fullt fungerande implementation av CAST. Synd bara att koden är skriven på ett i stort sett oläsbart och (försök till) prestandamaximerat sätt vilket gör den väsentligen oanvändbar som referensmodell.

Jag tycker att det inte är så konstigt om såpass gammal kod inte fungerar då de implicita förutsättningarna ändrats. I dag bör man i alla fall se till att koda på ett sätt som minimerar eller helst eliminerar implicita förutsättningar. Men att ingen sedan 1996 eller så testat CAST-BAR och sett att det saknas en fil är desto mer förvånande. Jag har haft kontakt med Bruce och levererat den uppdaterade, hela och fungerande versionen av CAST-BAR till honom. Den bör dyka upp på hans webbplats i närtid.

Så nu är det bara att jaga vidare efter en användbar referensmodell. Eller så får det bli som jag gjort mer än en gång – skriva en egen referensmodell i Python. Ett utmärkt språk för att skriva funktionella referensmodeller. All in a days work. Kul!

Konvertera sbox till hårdvara

Sitter och tittar på Bentfunktioner. Dessa används i vissa fall för att skapa ersättningstabeller (sbox) i krypton. Ett krypto som använder detta är det symmetriska blockkryptot CAST.

För att analysera hur en sbox beter sig bitmässigt kan det vara intressant att omvandla tabellen till en uppsättning ANF-nät. Detta är nätlistor med logiska AND-OR-operationer med tabellens inoperands bitar som invärden. En nätlista skapas för varje bit ut från tabellen. Och som tur är det har Bo Zhu vid Shanghais universitet hackat ihop ett verktyg som gör detta.

Sbox2ANF är ett GPL-licensierat Pythonprogram som kan ta en Sbox-tabell och generera nätlistor för alla utbitar:
The sample sbox
y = sbox(x) = (0, 2, 4, 6, 7, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15)
has been translated to ANF Boolean functions

y0 = x2 + x0x2 + x1x2 + x0x1x2 + x3 + x2x3 + x0x2x3 + x1x2x3 + x0x1x2x3
y1 = x0 + x2 + x0x2 + x1x2 + x0x1x2 + x2x3 + x0x2x3 + x1x2x3 + x0x1x2x3
y2 = x1 + x2 + x0x2 + x1x2 + x0x1x2 + x2x3 + x0x2x3 + x1x2x3 + x0x1x2x3
y3 = x0x2 + x1x2 + x0x1x2 + x2x3 + x0x2x3 + x1x2x3 + x0x1x2x3

Eftersom det är ett Pythonprogram går det naturligtvis även att importera in och använda som byggblock i sina egna program. Väldigt praktiskt, exempelvis som i mitt fall där jag bygger generatorer för hårdvarubeskrivningar av krypton och vill kunna välja hur en sbox ska implementeras. Antingen som en tabell som kräver ROM-minne, eller som en uppsättning logiska grindar.

Ny version av M2Crypto

M2Crypto (MeTooCrypto), en Pythonwrapper för OpenSSL utvecklad av Heikki Toivonen har släppts i en ny version (0.21.1).

Även om Python 3.x har tagit stora steg mot en bra wrapper av OpenSSL, vilket därmed finns med i standardbiblioteket har M2Crypto fortfarande stöd för fler av OpenSSLs funktionalitet och för nyare versioner av OpenSSL. Den nya versionen av M2Crypto stödjer exempelvis OpenSSL 1.0.x

Om man behöver köra Python 2.x är M2Crypto helt klart att föredra framför ssl-funktionen i standardbiblioteket.