Avatar billede codemode Nybegynder
04. februar 2007 - 18:24 Der er 3 kommentarer

AES problemer

Hey allesammen,

I stedet for at bruge Javas indbyggede kryptering taenkte jeg at jeg ville skrive det hele selv - saa det gjorde jeg - med AES som metode og det virkede helt fint med alle teststrings jeg forsogte og med alle passwords!

Dvs alle processerne skulle vaere korrekte (altsaa mixColumns, Subbytes, AddRoundkey) men da jeg nu forsoger at faa den til at laese en test fil, encrypte den og derefter decrypte den igen er jeg stodt paa problemer!

Jeg har skrevet selve krypteringen og dekrypteringen saa den bruger en 'short' 4x4 array og jeg tror maaske problemet ligger i at den selvfolgelig modtager bytes som input og sender ogsaa bytes ud som output.

Det jeg gor ved enkrypteringen er at indlaese en fil med FileInputStream og saa smide det i en array som jeg saa deler op i 16 byte stykker som jeg korer igennem en af gangen - og saa samme metode selvfolgelig med decrypting!

Nogle af linierne i denne test tekst fil er da ogsaa korrekte, men der synes at vaere nogle bytes der kan faa hele til at gaa galt!


Testinput:
Dette er et test dokument 12345
som ogsaa bruger tegn, og linieskift!

Output efter encryption og decryption:
gíá›p    •ƒvsGZ„KÒ dokument 12345 ÿ´ÆuV.%Ë~Ê å€Òr tegn, og linieskift!

Som det kan ses gik forste og tredje krypterings runde galt mens anden og sidste gav det rgitge output...

Please er der nogen der kan hajelpe ville jeg vaere most grateful!
Avatar billede winners79 Nybegynder
04. februar 2007 - 19:44 #1
nok nemmere med noget kode, for mig anyways
Avatar billede codemode Nybegynder
04. februar 2007 - 20:49 #2
ok :)

public class doDecrypt
{
    private short [] key = new short[176];
    private short [][] state = new short [4][4];
    private int r = 0;
    private int TotalRounds = 10;
    private int kpos = 175;
    public byte [] outgoing = new byte[16];
   
    public doDecrypt (byte [] inc, short [] inKey)
    {
        key = inKey;
        short[][] state = new short[4][4];
       
        //Input data to state
          for (int c = 0; c < 4; c++)
            for (int r = 0; r < 4; r++)
                //state[r][c] = inc[r+(4*c)];
                state[r][c] = alterByteToShort(inc[r+(4*c)]);
         
       
        InvAddRoundKey(state);
        for (int i = 1; i < TotalRounds; i++)
        {
            InvShiftRows(state);
            InvSubBytes(state);
            InvAddRoundKey(state);
            InvMixColumns(state);
        }
        InvShiftRows(state);
        InvSubBytes(state);
        InvAddRoundKey(state);
       
        //Need some sort of out!
        for (int k=0; k<4; k++)
            for (int l=0; l<4;l++)
                outgoing[l+(4*k)] = (byte)(state[l][k] & 0xff);
       
    }

Det er fra decryption ^^

og her er selve filen der kalder decryption delen:

import java.io. *;
public class deepControlDec
{
    public deepControlDec(String Filename, String pass)
    {
        try
        {
            byte [] decodeArray = new byte[16];
            short [] cryptKey = new short[16];
            byte [] leftClean = new byte[16];
            short [] finalKey = new short[176];
           
            int numParts;
            int exParts;
           
            if (pass.length() < 16)
            {
                int remain = 16 - pass.length();
                for (int i = 0; i < remain; i++)
                {
                    pass = pass + "\0";
                }
            }
           
            //Get the pass key
              for (int i = 0; i < 16; i++)
              {
                  cryptKey[i] = (short)pass.charAt(i);
              }
             
            getKey Generatedkey = new getKey(cryptKey, 16);
              finalKey = Generatedkey.out;
           
            //Assign file
            File incFile = new File(Filename);
            FileInputStream inStream = new FileInputStream(incFile);
            //make the data array as long as the file!
            byte [] dataArray = new byte[inStream.available()];
           
            numParts = (dataArray.length / 16);
            exParts = (dataArray.length % 16);

            System.out.println("Parts: " + numParts);
            System.out.println("Excess: " + exParts);
            inStream.read(dataArray, 0, dataArray.length);
           
            //Alter filename
            String altFilename = Filename.substring(0,Filename.length()-4);
            System.out.println(altFilename);
            //output to file + darkdeep encryption .dec
            FileOutputStream outStream = new FileOutputStream(altFilename + ".test");
           
            BufferedOutputStream bufOut = new BufferedOutputStream(outStream, 2048);
           
            for (int i = 0; i < numParts; i++)
            {
                System.out.print("\nArray number " + i + "\n");
                for (int j = 0; j < 16; j++)
                {
                    decodeArray[j] = dataArray[j+(i*16)];
                    //System.out.print((char)decodeArray[j] + " ");
                }
                doDecrypt decrypted = new doDecrypt(decodeArray, finalKey);
                for (int q=0; q<16; q++) System.out.print((char)decrypted.outgoing[q] + " ");
                bufOut.write(decrypted.outgoing, 0, 16);
                bufOut.flush();
            }
           
            if (exParts != 0)
            {
                byte [] exArray = new byte[exParts];
                for (int i = 0; i < exParts; i++)
                {
                    System.out.print((char)dataArray[dataArray.length-exParts+i] + " ");
                    exArray[i] = dataArray[dataArray.length-exParts+i];
                    exArray[i] = (byte)(exArray[i] ^ (0x07+i));
                }
                bufOut.write(exArray,0,exParts);
                bufOut.flush();
            }
           
            bufOut.close();

   
        }
        catch (IOException ioe) {System.out.println("File error encountered!");}
    }
   
}


Kan du se noget kan vaere galt!?
Avatar billede winners79 Nybegynder
10. februar 2007 - 21:11 #3
mangler kode til flere metoder du bruger
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester