tutorials.de Buch-Aktion 05/2012
Like Tree3Danke
  • 3 Beitrag von SE
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
1596
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    sebastianb sebastianb ist offline Mitglied Gold
    Registriert seit
    Dec 2009
    Beiträge
    125
    Hallo zusammen,

    aus Spaß an der Sache wollte ich gerade ein Beispiel von Thomas, das ich hier im Forum gefunden habe, ein wenig erweitern. Ziel sollte es eigentlich sein ein Bild einzulesen um es danach wieder verschlüsselt abzuspeichern, nur leider will mein vll etwas naiver Lösungsansatz nicht so richtig.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    
    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferByte;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.PrivateKey;
    import java.security.PublicKey;
     
    import javax.crypto.Cipher;
    import javax.crypto.CipherInputStream;
    import javax.crypto.CipherOutputStream;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.PBEKeySpec;
    import javax.imageio.ImageIO;
    import javax.imageio.stream.ImageOutputStream;
     
    public class Temp
    {
     
       private static byte[] loadImage() throws IOException
       {
          File file = new File("c:/krypto/test.jpeg");
          
          BufferedImage bufferedImage = ImageIO.read(file);
     
          ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
          
          ImageIO.write(bufferedImage, "jpeg", byteArrayOutputStream);
          
          return byteArrayOutputStream.toByteArray();
       }
       
       private static void saveImage(byte[] image) throws IOException
       {
          File file = new File("c:/krypto/test.cry");
          
          FileOutputStream foStream = new FileOutputStream(file);
     
          ByteArrayOutputStream oStream = new ByteArrayOutputStream();
     
          oStream.write(image);
     
          oStream.writeTo(foStream);
       }
     
     
       public static void main(String[] args) throws Exception
       {
     
          String algorithm = "RSA";
          KeyPair keyPair = KeyPairGenerator.getInstance(algorithm).generateKeyPair();
          File publicKeyFile = new File("c:/krypto/key.txt");
          writeKey(keyPair.getPublic(), publicKeyFile);
          PublicKey publicKey = readPublicKey(publicKeyFile);
     
          Cipher cipher = Cipher.getInstance(algorithm);
     
          byte[] tmp = encrypt(loadImage(), cipher, publicKey);
          
          saveImage(tmp);
     
       }
     
       private static byte[] encrypt(byte[] data, Cipher cipher, PublicKey publicKey) throws Exception
       {
     
          cipher.init(Cipher.ENCRYPT_MODE, publicKey);
          ByteArrayOutputStream baosEncryptedData = new ByteArrayOutputStream();
          CipherOutputStream cos = new CipherOutputStream(baosEncryptedData, cipher);
          cos.write(data);
          cos.flush();
          cos.close();
          return baosEncryptedData.toByteArray();
       }
     
       private static PublicKey readPublicKey(File file) throws Exception
       {
          ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
          PublicKey publicKey = (PublicKey) objectInputStream.readObject();
          objectInputStream.close();
          return publicKey;
       }
     
       private static void writeKey(PublicKey publicKey, File file) throws Exception
       {
          ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
          objectOutputStream.writeObject(publicKey);
          objectOutputStream.close();
       }
    }

    das eigentlich Problem ist, dass ich beim Aufruf von

    Code java:
    1
    
     byte[] tmp = encrypt(loadImage(), cipher, publicKey);

    ein leeres Array geliefert bekomme. Leider fehlt mir hier aber ein wenig das Basiswissen um selber auf den Fehler zu kommen.

    Viele Dank euch schonmal

    Sebastian
     

  2. #2
    Herbertus Herbertus ist offline Mitglied Bronze
    Registriert seit
    Sep 2010
    Beiträge
    37
    Schau doch mal, ob dein File überhaupt gefunden wird (damit meine ich beide file's)
    Kannste dir ja einfach was in die Konsole geben lassen(siehe Code) oder du behandelst Exceptions

    Code java:
    1
    2
    3
    
     
    if(file.exists() && file.canRead() )
        System.out.println("gefunden und lesbar");
    Geändert von Herbertus (12.11.10 um 14:13 Uhr)
     

  3. #3
    sebastianb sebastianb ist offline Mitglied Gold
    Registriert seit
    Dec 2009
    Beiträge
    125
    Hi,

    das war auch mein erster Gedanke aber beim Aufruf von

    Code java:
    1
    
    saveImage(loadImage)

    wird das Bild korrekt kopiert. Die Kopie ist zwar ein KB kleiner aber das sollte mich nicht weiter stören

    hier nochmal der Orginalpost von Thomas, den ich ein wenig verändert habe:

    http://www.tutorials.de/java/212543-...ml#post1370684

    das einzige was ich verändert habe ist die Signatur von encrypt und den darin enthaltene Aufruf von cos.write(...)

    Gruß

    Sebastian
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.166
    Hi.

    Irgendwie machst du dir aber doppelte Arbeit: du liest ein JPEG mit ImageIO, kreierst dann ein ByteArrayOutputStream und schreibst dann da ein als JPEG gerendertes Bild rein. Warum benutzt du denn nicht gleich die Daten aus der Datei?

    Der Fehler liegt bei der Wahl des Ciphers. SUN's / Oracles RSA Implementierung verschlüsselt max. einen ganzen Block und tut offenbar einfach *nichts* (sprich: wirft keine Exception) wenn die Daten zu groß sind (also nicht in den Block passen).

    Siehe z.B. http://www.ureader.de/message/629570.aspx

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    sebastianb sebastianb ist offline Mitglied Gold
    Registriert seit
    Dec 2009
    Beiträge
    125
    Hi,

    danke für den Hinweis =)

    Gruß

    Sebastian
     

  6. #6
    SE Tutorials.de Gastzugang
    So, ich roll den Thread hier bewusst noch mal auf, um endlich mal ne Lösung für die Probleme zu geben.

    In den Jahren 2005 , 2007 , 2008 und 2010 wurden immer wieder die selben Fehler gemacht :

    erstens : bei den asynchronen KeyPairGeneratoren muss man auf das initialisieren achten. Es reicht nicht nur ein KeyPairGenerator.getInstance aufzurufen, mann muss diese dann auch noch richtig initialisieren mit KeyPairGenerator.initialize

    zweistens : egal für welchen Modus, Cipher müssen ebenfalls initialisiert werden. Das geht mit Cipher.init Natürlich vorher über Cipher.getInstance erstmal ne Instanz holen.

    drittens : SUN's RSA-Provider kann nur maximal 128 Byte, also die 1024bit Schlüssellänge, an einem Stück verschlüsseln. Alles was drüber geht wird entweder verworfen oder bei entsprechendem init als Blockverschlüsselung verarbeitet.

    viertens : RSA ist nicht dafür gedacht größere Daten zu verschlüsseln. Es wird in der regel nur für den sicheren Austausch eines symetrischen Schlüssels verwendet.

    fünftens : in Bezug auf den Thread 212543, welcher hier erwähnt wurde, möchte ich nachträglich darauf hinweisen : ja, es ist richtig das RSA und AES und auch die meisten anderen Cryptoverfahren auf mathematischen Rechnungen beruhen. Aber wie der Rechner die Kombination der Massen an Bits als ZAHLEN darstellt sollte man der Implementierung überlassen. Das alles selbst zu implementieren dürfte selbst nach RFC verdammt schwierig und umfangreich werden. Man sollte einfach fertige Frameworks wie die SUN Implementierung oder BouncyCastle verwenden.


    Zum Thema des "BILD"-verschlüsselns :

    Es ist nichts anderes als das Verschlüsseln einer Datei.
    Wobei es grade bei multimedia-Dateien *Bilder, Musik, Video* mehrere Arten von Verschlüsselungen gibt.
    Bei Bildern z.b. kannst du entweder die Datei normal verschlüsseln und hast dann "Datensalat" oder du machst dir die Mühe das Bild auch als solches einzulesen, dir die Graphic-Informationen holen, diese zu verschlüsseln und dann wieder als Bild abzuspeichern. So würde dann z.B. aus einem schwarzen Bild ein buntes werden. Das Ganze ist leider komplizierte als es sich so einfach anhört, aber ich denke das es möglich sein sollte mit ImagIO was auf die Reihe zu bekommen.
    Analog gilt das selbe für Audio und Video

    Ein fertiges Hybrid-Krypto-System findet ihr hier
    http://www.java-forum.org/allgemeine...ptosystem.html
    Das Ganze ist nicht auf die Verwendung über Netzwerk beschränkt. Einfach eine caster-Klasse drum bauen die die Streams in Dateien umleitet. Und eine Erweiterung der asynccrypt.java um eine Methode zum Speichern des private-Keys. Und schon kann man das Ganze auch zur Dateiverschlüsselung verwenden.
    Werde bei Gelegenheit mal was entsprechdenes zusammenbauen.
    Geändert von SE (09.02.11 um 15:12 Uhr) Grund: (siehe Post von deepthroat)
    Bratkartoffel, genodeftest und sebastianb bedanken sich. 

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.166
    Hi.

    Wenn du das jetzt noch in eine ordentliche Form bringst (Groß-/Kleinschreibung, Satzzeichen, Absätze etc. -- siehe Netiquette) würde sich das evtl. auch jemand durchlesen.

    Gruß
    Geändert von deepthroat (08.02.11 um 14:47 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    SE Tutorials.de Gastzugang
    hab ich gemacht wie du sehen solltest
    aber was die netiquette angeht ist dein nick auch sehr zwiespältig
    aber ich denke das du das schon selbst weist
    Geändert von SE (09.02.11 um 15:12 Uhr)
     

Ähnliche Themen

  1. URL mit PHP verschlüsseln
    Von Dörti.Hermi im Forum PHP
    Antworten: 6
    Letzter Beitrag: 30.08.07, 11:21
  2. Verschlüsseln
    Von d_Artagne im Forum .NET Datenverwaltung
    Antworten: 20
    Letzter Beitrag: 16.10.05, 21:52
  3. verschlüsseln
    Von hhunderter im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 30.06.05, 19:03
  4. verschlüsseln
    Von marcaurel1984 im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 15.06.05, 12:14
  5. Verschlüsseln?
    Von Janares im Forum Visual Basic 6.0
    Antworten: 6
    Letzter Beitrag: 11.04.03, 10:18