Zastosowanie bibliotek Java Cryptography Extension i Java Mail do szyfrowania poczty elektronicznej mgr inż. Piotr Kopniak Instytut Informatyki Wydział Elektrotechniki i Informatyki Politechnika Lubelska
mgr inż. Piotr Kopniak Plan prezentacji Aspekty ochrony informacji Architektura kryptograficzna w Javie Budowa zabezpieczonej wiadomości pocztowej w Javie Przesyłanie poczty - Java Mail Wnioski i dalsze badania
mgr inż. Piotr Kopniak Aspekty ochrony informacji Ochrona informacji polega na zapewnieniu: Poufności – informacja powinna być tajna, nie możliwa do odczytania dla osób nie powołanych. Poufność zapewniana jest przez szyfrowanie (np.: symetryczne - DES, Blowfish, asymetryczne - RSA, ElGamal). Integralności – potwierdzenie, że przesyłane dane nie są zmodyfikowane podmienione lub uszkodzone przez intruza. Potwierdzanie, że dane są prawdziwe możliwe jest dzięki funkcjom skrótu (np.: MD5, SHA-1). Autentyczności - oznacza, że przesłane dane rzeczywiście pochodzą od nadawcy który podaje się za ich autora. Kryptografia daje możliwość udowodnienia tożsamości za pomocą certyfikatów (np.: X.509) i podpisów cyfrowych (np.: DSA).
mgr inż. Piotr Kopniak Szyfrowanie symetryczne i asymetryczne
mgr inż. Piotr Kopniak Podpis elektroniczny
mgr inż. Piotr Kopniak Architektura kryptograficzna w Javie Architektura kryptograficzna środowiska Javy opiera się na rozdziale projektu i implementacji. Całokształt tworzenia klas kryptograficznych, czyli projekt, określany jest przez strukturę Java Cryptography Architecture (JCA). Implementacja wymaga stworzenia własnych klas dziedziczących z klas konceptualnych i jest dołączana z wykorzystaniem koncepcji dostawców (ang. cryptographic providers). Java dystrybuowana jest z dwoma domyślnymi dostawcami o nazwach SUN i SunJCE (JCE). Oprogramowanie biblioteczne związane z autentykacją i silną kryptografią zawarte jest obecnie w standardowej dystrybucji języka Java (od wersji 1.3). Klasy służące do tworzenia bezpiecznych programów w Javie zawiarte są w pakietach: java.security, java.security.cert, java.security.interfaces, java.security.spec, javax.crypto, javax.crypto.interfaces i javax.crypto.spec
mgr inż. Piotr Kopniak Dodanie dostawcy kryptograficznego 1. Edycja ręczna pliku właściwości bezpieczeństwa java.security znajdujący się w katalogu (katalog domowy Javy)/JRE/lib/security. Dodanie dostawcy polega na dopisaniu linii: security.provider. =, np.: security.provider.6=cryptix.jce.provider.CryptixCrypto 2. Dodanie dostawcy z poziomu programu: java.security.Provider p = new cryptix.jce.provider.CryptixCrypto(); java.security.Security.addProvider(p); Architektura JCA jest oparta na klasach abstrakcyjnych i statycznych metodach fabrykujących. Taka budowa umożliwia używanie nowo dodanych algorytmów, po rejestracji dostawcy, identycznie jak algorytmów dostarczonych przez producenta.
mgr inż. Piotr Kopniak Algorytmy kryptograficzne Algorytmy dostawców SUN i JCE –Szyfry symetryczne: Blowfish, DES, DESede, PBEwithMD5andDES, PBEwithMD5andDESede –Funkcje skrótu: MD2, MD5, SHA-1, HMAC-MD5, HMAC-SHA1 –Algorytm uzgadniania klucza: Diffle-Hellman –Podpisy elektroniczne: DSA, SHA1withDSA, MD2withRSA, MD5withRSA, SHA1withRSA Dodatkowe algorytmy dostawcy Criptix JCE –Szyfry symetryczne: CAST5, IDEA, MARS, RC2, RC4, RC6, Rijndael, Serpent, SKIPJACK, Square, Twofish –Szyfry asymetryczne: RSAES-OAEP, RSA/PKCS#1, ElGamal/PKCS#1 –Funkcje skrótu: MD4, RIPEMD-128, RIPEMD-160, SHA-0, SHA- 256/384/512, Tiger, HMAC-MD2, HMAC-MD4, HMAC-RIPEMD-128, HMAC-RIPEMD-160, HMAC-SHA-0, HMAC-Tiger –Podpisy elektroniczne: RawDSA, RSASSA-PKCS1, RSASSA-PSS
mgr inż. Piotr Kopniak Budowa zabezpieczonej wiadomości
mgr inż. Piotr Kopniak Metoda szyfrująca (1) Nazwa nadawcy (X.500) KeyStore ks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream("c:/windows/.keystore"),new String("StoreStore").toCharArray()); java.security.cert.Certificate cert = ks.getCertificate(ourKeyAlias); String ourDistName = ((X509Certificate)cert).getSubjectDN().toString(); Podpis elektroniczny (SHA-1 + RSA) byte[] plain_byte = plain_txt.getBytes(); PrivateKey privateKey = (PrivateKey)ks.getKey(ourKeyAlias,ourPassword); Signature sign = Signature.getInstance("SHA1withRSA"); sign.initSign(privateKey); sign.update(plain_byte); byte[] plainSign = sign.sign();
mgr inż. Piotr Kopniak Metoda szyfrująca (2) Szyfrowanie symetryczne treści (DESede) KeyGenerator kg = KeyGenerator.getInstance("DESede"); kg.init(new SecureRandom()); Key sessionKey = kg.generateKey(); Cipher cph = Cipher.getInstance("DESede/CBC/PKCS5Padding"); cph.init(Cipher.ENCRYPT_MODE,sessionKey); byte[] cipher_byte = cph.doFinal(plain_byte); byte[] iv = cph.getIV(); Szyfrowanie asymetryczne klucza sesyjnego (RSA) java.security.cert.Certificate cert = ks.getCertificate(cert_alias); cph = Cipher.getInstance("RSA/ECB/PKCS#1"); cph.init(Cipher.ENCRYPT_MODE, cert); byte[] cipherKey = cph.doFinal(sessionKey.getEncoded());
mgr inż. Piotr Kopniak Całość wiadomości ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(); DataOutputStream dataOutput = new DataOutputStream(byteOutput); dataOutput.writeUTF(ourDistName); dataOutput.writeInt(iv.length); dataOutput.write(iv); dataOutput.writeInt(cipherKey.length); dataOutput.write(cipherKey); dataOutput.writeInt(plainSign.length); dataOutput.write(plainSign); dataOutput.writeInt(cipher_byte.length); dataOutput.write(cipher_byte); byte[] cipher_byte = byteOutput.toByteArray();
mgr inż. Piotr Kopniak Metoda deszyfrująca Implementacja metody deszyfrującej polega na wykonaniu czynności podobnych jak przy szyfrowaniu tylko w odwrotnej kolejności, tzn.: –Odczytanie klucza prywatnego odbiorcy z jego magazynu kluczy –Deszyfrowanie klucza sesyjnego za pomocą klucza prywatnego odbiorcy –Deszyfrowanie wiadomości za pomocą klucza sesyjnego Deszyfrowanie polega na zainicjowaniu szyfru w trybie deszyfrowania DECRYPT_MODE kluczem publicznym nadawcy przy deszyfrowaniu klucza sesyjnego i kluczem sesyjnym przy deszyfrowaniu wiadomości. Metoda deszyfrująca dodatkowo weryfikuje tożsamość nadawcy PublicKey theirPublic = xCert.getPublicKey(); Signature sign = Signature.getInstance("SHA1withRSA"); sign.initVerify(theirPublic); sign.update(plain_byte); boolean isOk = sign.verify(plainSign);
mgr inż. Piotr Kopniak Biblioteka Java Mail JavaMail API jest to zbiór klas do budowy aplikacji przesyłających pocztę elektroniczną oraz inne wiadomości, który umożliwia tworzenie aplikacji niezależnych od platformy systemowej, dostawcy Internetu i protokołu komunikacyjnego. Biblioteka JavaMail dystrybuowana jest jako opcjonalny pakiet standardowej platformy Java 2 (J2SE) oraz jako integralna część platformy Java 2 Entrprise Edition (J2EE). Obsługiwane protokoły i standardy zaimplementowane przez firmę Sun: –SMTP (Simple Mail Transfer Protocol) –POP (Post Office Protocol) –IMAP (Internet Message Access Protocol) –MIME (Multipurpose Internet Mail Extension)
mgr inż. Piotr Kopniak Java Mail - wysyłanie poczty String host = pluton.pol.lublin.pl; String from = String to = Properties props = System.getProperties(); props.put("mail.smtp.host", host); Session session = Session.getDefaultInstance(props, null); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject(Szyfrowana poczta"); message.setText((new BASE64Encoder()).encode(byteArr)); Transport.send(message);
mgr inż. Piotr Kopniak Java Mail - odbieranie poczty String host = pluton.pol.lublin.pl; String username = janek; String password = haslo; Properties prop = new Properties(); Session session = Session.getDefaultInstance(prop, null); Store store = session.getStore("pop3"); store.connect(host, username, password); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); for (int i=0, n=message.length; i<n; i++) { System.out.println(i + ": " + message[i].getFrom()[0] + "\t" + message[i].getSubject() + \n + message[i].writeTo(System.out); ) folder.close(false); store.close();
mgr inż. Piotr Kopniak Przeprowadzone badania Badanie szybkości szyfrowania algorytmów symetrycznych i asymetrycznych Badanie czasu brutalnego łamania szyfru DES poprzez przeszukanie połowy przestrzeni kluczy –Ilość kombinacji 2^56: –Czas połowy możliwych kluczy: ms lat
mgr inż. Piotr Kopniak Szyfrowanie symetryczne i asymetryczne
mgr inż. Piotr Kopniak Wnioski i dalsze badania Wnioski Java jest językiem o bogatej funkcjonalności standardowej i językiem otwartym, który nadaje się do zabezpieczania danych z wykorzystywaniem szyfrowania, certyfikatów i podpisów elektronicznych. Ze względu na to, że Java jest językiem interpretowanym nie nadaje się do implementacji kryptoanalitycznych. Atak brutalny na szyfr DES zająłby lat na komputerze z procesorem 1 GHz. Algorytmy szyfrujące asymetryczne są ok. 10 razy wolniejsze od symetrycznych. Dalsze badania Poprawa łączenia szyfrowanych bloków przy szyfrowaniu algorytmem RSA Stworzenie implementacji znanych metod kryptoanalitycznych, które mogą posłużyć do efektywniejszych testów szyfrowania oraz budowy aplikacji kryptoanalitycznych.
Ocena efektywności zastosowania bibliotek Java Cryptography Extension i Java Mail do szyfrowania poczty elektronicznej Dziękuję za uwagę mgr inż. Piotr Kopniak Instytut Informatyki Wydział Elektrotechniki i Informatyki Politechnika Lubelska