Projekt

Hrvoje Kozak
0036460674
FER, godina: 2013./2014.
Mentor: Marin Golub

Download: apk | source

Kriptografija na android operativnom sustavu

Na ovom projektu razvio sam aplikaciju u Javi koja daje kratki pregled rada s kriptografskim algoritimima na operativnom sustavu Android. Tom aplikacijom korisnik dolazi u mogućnost kroz jednostavno i intuitivno sučelje bolje si predočiti način rada nekoliko različitih algoritama kriptiranja uz podešavanje parametara istih kao što su način kriptiranja i padding. Osnovna funkcionalnost aplikacije je takva da sve što korisnik treba je unjeti tekst za kriptiranje, odabrati algoritam, način kriptiranja i padding, te kriptirati taj tekst nakon čega će dobiti ispisanu kriptiranu poruku na ekranu. Aplikacija je namijenjena prvenstveno u edukacijske svrhe studenata Fakulteta Elektrotehnike i Računarstva.


Tehničke značajke

Android OS nam za ovakve stvari nudi dva bitna java libraryja, a to su java.security i javax.crypto.

  1 import java.security.*;
  2 import javax.crypto.*;

Prva korisna stvar koju možemo vidjeti prije nego što počnemo je koje algoritme uopće imamo podržane i to ćemo napraviti ovako:

 26 Provider[] providers = Security.getProviders();
 27 for (Provider provider : providers) {
 28 	Log.i(LOG_TAG, "provider: " + provider.getName());
 29 	for (Provider.Service service : provider.getServices()) {
 30 		Log.i(LOG_TAG,"algorithm: "+service.getAlgorithm());
 31 	}
 32 }

Na izlazu ćemo dobiti popis svih providera i algoritama koje podržavaju i on bi trebao izgledati ovako nekako (link).


MAC (Message Authentication Code)

U kriptografiji MAC je dio informacije koji se veže uz poruku koja se želi sigurno prenjeti. MAC sa sigurnošću može potvrditi izvor i cjelovitost poruke koja se prenjela. Najčešće se izvodi kao hash funkcija koja na ulazu očekuje privatni ključ korisnika, te generira MAC.

U Javi za generiranje ključeva imamo KeyGenerator razred, a za baratanje MAC-om nam na raspolaganju stoji Mac razred te njihove metode koje su prikazane u nastavku.

Prvo generiramo novi privatni ključ:

 1 private String algorithm = "MD5";
 2 
 3 // generiranje privatnog ključa
 4 private byte[] getRawKey(byte[] seed) throws Exception {
 5     KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
 6 
 7     SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
 8     sr.setSeed(seed);
 9 
10     keyGenerator.init(keySize, sr);
11     SecretKey secretKey = keyGenerator.generateKey();
12 
13     byte[] rawKey = secretKey.getEncoded();
14     return rawKey;
15 }

Zatim možemo izvući MAC iz poruke pomoću tog ključa:

18 byte[] rawKey = getRawKey(seed.getBytes());
19 
20 // dobivanje specifičnog ključa od bajtova privatnog ključa
21 SecretKeySpec secretKeySpec = new SecretKeySpec(rawKey, algorithm);
22 
23 Mac mac = Mac.getInstance(algorithm);
24 mac.init(secretKeySpec);
25 
26 // izračunaj mac na poruci
27 byte[] encrypted = mac.doFinal(message.getBytes());


Kriptiranje podataka

Postoje dvije vrste kriptiranja podataka a to su simetrično i asimetrično. Za njihovu izvedbu će nam pomoći razredi Cipher koji vrši samo kriptiranje, te KeyPairGenerator za generiranje para ključeva (privatnog i javnog). Možemo i specificirati način rada algoritma enkripcije koji se koriste ovisno o potrebama jer svaki ima svoje mane i prednosti a standardni načini su:

  • ECB (Electronic Code Book)
  • CBC (Cipher Block Chaining)
  • CFB (Cipher Feedback Mode)
  • OFB (Output Feedback Mode)
  • Isto tako enkripcija se može provesti bit po bit ili pak na djelove bitova koje nazivamo blokovi (uobičajeno 64 bita duljina), te ukoliko duljina poruke nije djeljiva duljinom pojedinog bloka enkripcije, zadnji blok se proširuje paddingom da se popuni veličina bloka. Primjeri različitih paddinga su:

  • No padding
  • PCKS5
  • OAEP
  • SSL3
  • Način enkripcije i padding zadaju se instanci Cipher razreda pri inicijalizaciji u getInstance metodi koja prima string odgovarajućeg formata:

  • "algorithm/mode/padding"
  • ili samo

  • "algorithm"

  • Simetrično kriptiranje

    U simetričnom se kriptiranju koristi isti privatni ključ za enkripciju i dekripciju.

    30 // generiraj ključ
    31 byte[] rawKey = getRawKey(seed.getBytes());
    32 SecretKeySpec secretKeySpec = new SecretKeySpec(rawKey, algorithm);
    33 
    34 Cipher cipher = Cipher.getInstance(algorithm + "/" + mode + "/" + padding);
    35 cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
    36 
    37 // kriptiraj
    38 byte[] encrypted = cipher.doFinal(message.getBytes());

    Asimetrično kriptiranje

    Asimetrično kriptiranje koristi par ključeva od kojih jedan služi za enkripciju, a drugi za dekripciju. Time ključ za enkripciju može biti javan tako da svi mogu generirati kriptiranu poruku koju samo vlasnik privatnog ključa može pročitati.

    40 // generiranje ključeva
    41 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
    42 KeyPair keyPair = keyPairGenerator.generateKeyPair();
    43 PublicKey publicKey = keyPair.getPublic();
    44 PrivateKey privateKey = keyPair.getPrivate();
    45 
    46 // npr "RSA/ECB/PKCS1Padding"
    47 Cipher cipher = Cipher.getInstance(algorithm + "/" + mode + "/" + padding);
    48 
    49 cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    50 byte[] encrypted = cipher.doFinal(message.getBytes());


    Upute za korištenje


    Instalacija

    Ova aplikacija namijenjena je isključivo za android uređaje. APK paket možete skinuti ovdje


    Primjer korištenja

    Korištenje ove aplikacije skroz je jednostavno i intuitivno. Pri ulasku u aplikaciju otvara se glavni ekran na kojem se od korisnika traži unos tekstualne poruke koju želi kriptirati, zatim odabire algoritam, način kriptiranja i padding. Na kraju jednim pritiskom na gumb 'Kriptiraj’ korisniku se ispisuje kriptirana poruka u hex zapisu, te ukoliko kriptiranje nije uspjelo javlja poruku o grešci.



    Literatura

    1. Android developers, javax.crypto paket, prosinac 2013, http://developer.android.com/reference/javax/crypto/package-summary.html
    2. Android developers, java.security paket, prosinac 2013, http://developer.android.com/reference/java/security/package-summary.html
    3. Wikipedia, kriptografija, studeni 2013, http://en.wikipedia.org/wiki/Cryptography