HTML

Programozó Páternoszter

Ez a Programozó Páternoszter (PP) blogja, a programozásról szól. Aktualitása, hogy a Debreceni Egyetem Informatikai Kara Magasszintű programozási nyelvek 1-2, C++ esattanulmányok, Java esettanulmányok című kurzusainak blogja is egyben.

A vadászat

A Debreceni Egyetem Programozói Évkönyve: az UDPROG projekt. A szakmai fórumunk a Facebook-en. Az új előadások a prezin.
A régi előadások:
Prog1:
1. C bevezetés
2. C tárgyalás
3. C befejezés
4. C a gyakorlatban
5. C++ bevezetés
6. C++ tárgyalás
7. C++ befejezés
8. C++ a gyakorlatban
9. Java platform bevezetés
10. Kvantuminformatikai alg. bev.
Prog2:
1. Java bevezetés
2. Java tárgyalás
3. Java befejezés
4. Java a gyakorlatban
5. Software Engineering bev.
6. Java EE bevezetés
7. AspectJ bevezetés
8. BPMN-BPEL SOA programozás
9. C++ haladó
10. Tensorflow

Kövess engem!

Friss topikok

Linkblog

Harmadik hét - a CIA és a kick-off

2012.09.29. 12:12 nb

Prog2

A jelen harmadik laborgyakorlat reguláris része a közös http://www.inf.unideb.hu/~nbatfai/kp2/Kozos_Prog2_feladatok_BN_2012osz.pdf hozzájárulásunk 9. feladata az EXOR törés. Ez szokás szerint prog1-beli feladat, amelyet most Java-ban kell implementálnunk. Vegyük észre, hogy sokaknak gond nélkül ment a C, C++ kódok Java átírása... miért? Egyrészt, mert ügyesek természetesen, másrészt mert a C és a Java változó, kifejezés fogalmai megegyeznek; azaz szinte nem volt mit tanulni, csak élvezni az átírást.

1. lépés

A prog1-es http://progpater.blog.hu/2011/02/15/felvetelt_hirdet_a_cia poszt alapján C vagy Java programmal valósítsuk meg egy tetszöleges tiszta szöveg kódolását/dekódolását. (Az első 3-nak 2 trófea Java, 2 trófea az esetleges C implementációért).  A Java implementáció itt található: http://www.tankonyvtar.hu/hu/tartalom/tkt/javat-tanitok-javat/ch01.html, lap közepén a "1.12. példa - Titkosítás kizáró vaggyal" pontban, az ExorTitkosító osztályról van szó (aki nem hozzám járt, nem ismeri az EXOR-os titkosítást, annak kötelező elolvasni a Javát tanítok ezen példáját).

2. lépés

Magam is futtattam ezt a progit és az alábbi titkosított szöveget készítettem el 8 betűs számokból álló titkos kulccsal: http://www.inf.unideb.hu/~nbatfai/2012osz.titkos1 Mi a tiszta szöveg? Törd meg a saját progiddal ezt a kódot!

3. lépés

A törésed, segítségül használd a korábbi http://progpater.blog.hu/2011/02/15/felvetelt_hirdet_a_cia poszt C implementációját, vagy az ugyanerről szóló, de 1 évvel későbbi labor posztját: http://progpater.blog.hu/2012/02/25/de_ik_prog_labor_labdarugo_bajnoksag_es_kupa 5 trófea az első három sikeres törőnek (mi a tiszta szöveg és mi a pontos kulcs a kérdés).

Mentőmellény: akinek az ékezetek miatt gondja támad, egyrészt: http://progpater.blog.hu/2011/09/16/nem_mindig_a_jobbik_csapat_nyer/fullcommentlist/1#c14487806

vagy gedit ExorTitkosító.java bemásolása után:

[norbert@matrica EXOR]$ javac -encoding UTF-8 ExorTitkosító.java
[norbert@matrica EXOR]$ java ExorTitkosító kulcs <tiszta.txt >titkos.bin

[norbert@matrica 3]$ javac ExorToro.java
[norbert@matrica 3]$ time java ExorToro <2012osz.titkos1
00009999Mi indulunk, ha kell
Mi nem felejtjük el, hogy
Bennünk a vér piros-fehér
Mi küzdünk haver
Ha kell bárkivel
Mert a győzelem mindennél többet ér
...
A LOKIÉ!!!
real 0m1.675s
user 0m1.681s
sys 0m0.080s

/*
 * Első nekifutás: formális átírás (kommentezve este lesz a blogon) 2012. okt.
 * 2. Bátfai Norbert
 */

public class ExorToro {

  // Néhány konstans (ezek az átírandó C kód örökségei). 
  /**
   * Max. mekkora lehet a kezelt titkosított rész.
   */
  public static final int MAX_TITKOS = 65535;
  /**
   * Bufferelten olvasunk, (ez az átírandó C kód öröksége).
   */
  public static final int OLVASAS_BUFFER = 256;
  /**
   * Dupla PIN méretű a kulcs.
   */
  public static final int KULCS_MERET = 8;
  /*
   * Ahogy C-ben is, most is bájttömbökkel dolgozunk alapvetően, ez is
   * egyértelműen a C árírata.
   */
  /**
   * A kulcsot tárolja.
   */
  byte[] kulcs = new byte[KULCS_MERET];
  /**
   * A titkos szöveget tárolja.
   */
  byte[] titkos = new byte[MAX_TITKOS];
  /**
   * A titkosból előállított szöveget tárolja.
   */
  byte[] tiszta = new byte[MAX_TITKOS];
  /*
   * Bár a Java tömb már tudja a saját méretét, de most a titkos buffer nyilván
   * nagyobb, ezért tároljuk ebben, hogy mennyi is valójában a beolvasott titkos
   * szöveg mérete.
   */
  int titkosMeret;
  /*
   * Hová írjuk majd az eredményt? Erre a csatornára. (Ez a Javát tanítokos
   * példa öröksége.)
   */
  java.io.OutputStream kimenőCsatorna;

  /** Az <code>ExorToro</code> objektum elkészítése. */
  public ExorToro(java.io.InputStream bejövőCsatorna,
          java.io.OutputStream kimenőCsatorna)
          /*
           * Az IO problémás dolog, ezzel jelezzük a hívónak, hogy ilyen
           * kivételt dobhatunk az ExotToro létrehozásakor, mert a kivétellel a
           * konstruktorban nem foglalkozunk, azok értelmes kezelését a hívóra
           * bízzuk.
           */
          throws java.io.IOException {

    // Beállítjuk, hová írjuk majd az eredményt
    this.kimenőCsatorna = kimenőCsatorna;
    // Ebbe a bufferbe olvasunk majd a bejövő csatornáról.
    byte[] buffer = new byte[OLVASAS_BUFFER];
    // Mennyit olvasunk a bejövő csatornáról?
    int olvasottBajtok;
    // Hol tart a bufferelt olvasás?
    int titkosIndex = 0;

    // titkos fajt berantasa, a C mintájára, de lényegesen egyszerűsítve, hiszen nincs mutató léptetés
    while ((olvasottBajtok = bejövőCsatorna.read(buffer, 0, OLVASAS_BUFFER)) != -1) {

      // System.arraycopy: olvas el az API doksit!
      if (titkosIndex + olvasottBajtok < MAX_TITKOS) {
        System.arraycopy(buffer, 0, titkos, titkosIndex, olvasottBajtok);
        // Hol tart a bufferelt olvasás?
        titkosIndex += olvasottBajtok;
      } else {
        System.arraycopy(buffer, 0, titkos, titkosIndex, MAX_TITKOS - titkosIndex);
        // Hol tart a bufferelt olvasás?
        titkosIndex += (MAX_TITKOS - titkosIndex);
        break;
      }
    }

    // Mennyi titkos szöveget dolgozunk fel:
    titkosMeret = titkosIndex;

    // A C kódban az str-es függvények helyes működéséhez kellett a \0
    // ennek öröksége csal ez a ciklus
    for (int i = 0; i < MAX_TITKOS - titkosIndex; ++i) {
      tiszta[titkosIndex + i] = titkos[titkosIndex + i] = '\0';
    }

    // Így tesztelheted, hogy mit is olvastál be:
    // (érdemes olvasható szöveggel tesztelni a beolvasást)
    // System.out.println(new String(titkos));

  }

  public void tores() throws java.io.IOException {

    byte[] jegyek = new byte[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    // A C kódból átmósolt ciklus a fenti jegyekre átírva:
    // osszes kulcs eloallitasa
    for (int ii = 0; ii <= 9; ++ii) {
      for (int ji = 0; ji <= 9; ++ji) {
        for (int ki = 0; ki <= 9; ++ki) {
          for (int li = 0; li <= 9; ++li) {
            for (int mi = 0; mi <= 9; ++mi) {
              for (int ni = 0; ni <= 9; ++ni) {
                for (int oi = 0; oi <= 9; ++oi) {
                  for (int pi = 0; pi <= 9; ++pi) {
                    // végigzongorázzuk az összes kulcsot, ezért Brute Force jellegű a törés.
                    kulcs[0] = jegyek[ii];
                    kulcs[1] = jegyek[ji];
                    kulcs[2] = jegyek[ki];
                    kulcs[3] = jegyek[li];
                    kulcs[4] = jegyek[mi];
                    kulcs[5] = jegyek[ni];
                    kulcs[6] = jegyek[oi];
                    kulcs[7] = jegyek[pi];

                    if (exor()) {
                      kimenőCsatorna.write(kulcs, 0, KULCS_MERET);
                      kimenőCsatorna.write(tiszta, 0, titkosMeret);
                      // Csúnya itt, de gyorsan kíratom a time paranccsal futtatva
                      // a szükséges időt majd.
                      System.exit(0);
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

  }

  /** Másolva a C kódból, a típuskényszerítés kellett (de különben le sem fordul). */
  public boolean exor() {

    int kulcs_index = 0;

    for (int i = 0; i < titkosMeret; ++i) {

      tiszta[i] = (byte) (titkos[i] ^ kulcs[kulcs_index]);
      kulcs_index = (kulcs_index + 1) % KULCS_MERET;

    }

    return tiszta_lehet();
  }

  // A C kódból:
  public boolean tiszta_lehet() {
    // a tiszta szoveg valszeg tartalmazza a gyakori magyar szavakat
    // illetve az átlagos szóhossz vizsgálatával csökkentjük a
    // potenciális töréseket

    double szohossz = atlagosSzohossz();

    
    String tisztaStr = new String(tiszta);

    return szohossz > 6.0 && szohossz < 9.0
            && (tisztaStr.indexOf("hogy") != -1)
            && (tisztaStr.indexOf("nem") != -1);
  }

  // A C kódból:
  public double atlagosSzohossz() {
    int sz = 0;
    for (int i = 0; i < titkosMeret; ++i) {
      if (tiszta[i] == ' ') {
        ++sz;
      }
    }

    if (sz > 0) {
      return (double) titkosMeret / (double) sz;
    } else {
      // egy szó sem volt benne: 
      return Double.MAX_VALUE;
    }
  }

  public static void main(String[] args) {

    try {
      
      // Elkészítjük a törő objektumot (amely most a sztenderd inputról olvassa a 
      // titkos szöveget és a sztenderd kimenetre írja az eredményt) majd meg is
      // kérjük, hogy hajtsa végre a törést:
      new ExorToro(System.in, System.out).tores();

    } catch (java.io.IOException e) {

      // Ha volt kivétel kiírjuk a hívási láncot (a lényeg, hogy nem nyeljük le :)
      e.printStackTrace();

    }

  }
  /*
   * Az itteni kód egy része a konstruktorba, másik része a tores() módszerbe
   * kerül majd. int main (void) {
   *
   * char kulcs[KULCS_MERET]; char titkos[MAX_TITKOS]; char *p = titkos; int
   * olvasott_bajtok;
   *
   * // titkos fajt berantasa while ((olvasott_bajtok = read (0, (void *) p, (p
   * - titkos + OLVASAS_BUFFER < MAX_TITKOS) ? OLVASAS_BUFFER : titkos +
   * MAX_TITKOS - p))) p += olvasott_bajtok;
   *
   * // maradek hely nullazasa a titkos bufferben for (int i = 0; i <
   * MAX_TITKOS - (p - titkos); ++i) titkos[p - titkos + i] = '\0';
   *
   *...*/
}

Kick-off

Sokaknak ezek a feladatok nem kihívások abban az értelemben, hogy vagy eleve hozzák a megoldást, vagy gyorsan elkészítik, íme nekik szólhat a  labor nem reguláris feladata.

dvsc_goal_intensity.png

Feladat: az alábbi Java kód mintájára készítsük el a jelen bajnokság minden csapatának hasonló kartonját! Egy kartonért adok 6 trófeát. A bemenő mérkőzés adatokat az MLSZ megfelelő lapjairól tudod leolvasni.

/* GoalIntensity.java
   2012. szept. 27.
 */

package goalintensity;

/**
 * Kísérletek a gól intenzitás környékén.
 * (A gól intenzitás fogalma kapcsán lásd a John Wesson (2002) The Science of Soccer isbn 0750308133 könyvet.)
 *
 * @author Norbert Bátfai
 * @version 0.0.1
 */
public class GoalIntensity {

  /**
   * A 2012/13 bajnokság kezdetétől pozitív percben a lőtt gól, negatívban a
   * kapott. Ezeket az adatokat az MLSZ adatbankjából tudod kikattintgatni:
   * http://adatbank.mlsz.hu/foprog.asp?menu=p00_0001&p_evad=11&p_szervezet=24&p_verseny_id=9593
   */
  int[] goals = {
    /*
8	SIDIBE	IBRAHIMA
10	SZAKÁLY	PÉTER
26	SIDIBE	IBRAHIMA
45	KULCSÁR	TAMÁS
-11	ANDRIC	NEMANJA
...
     */
    8,
    10,
    26,
    45,
    -11,
    -117,
    2 * 90 + 23,
    2 * 90 + 73,
    -233,
    -317,
    -330,
    3 * 90 + 70,
    3 * 90 + 74,
    3 * 90 + 79,
    4 * 90 + 77,
    6 * 90 + 5,
    6 * 90 + 8,
    6 * 90 + 53,
    6 * 90 + 64,
    -561,
    -686
  };

  public void eredoEs60asAblak(int f) {

    int eredo[] = new int[f * 90];
    int golInt[] = new int[f * 90];
    int meccsEredmeny[] = new int[f * 90];

    // A defenzív taktika:
    for (int i = 0; i < eredo.length; ++i) {

      eredo[i] = golInt[i] = meccsEredmeny[i] = 0;

    }

    // Elhelyezzük az "idővonalakon" (most az első 8 forduló percben), hol estek a gólok
    for (int i = 0; i < goals.length; ++i) {

      if (goals[i] < 0) {
        eredo[Math.abs(goals[i])] = meccsEredmeny[Math.abs(goals[i])] = -1;

      }
      if (goals[i] > 0) {
        eredo[goals[i]] = meccsEredmeny[goals[i]] = 1;
      }

    }
    
    int gyujto = 0, gyeredo = 0;

    for (int i = 0; i < eredo.length; ++i) {

      gyeredo += eredo[i];
      eredo[i] = gyeredo;

      // A golInt idővonalát úgy vizsgáljuk, hogy csak 
      // az utolsó 60 perc számít, de amúgy úgy kezeljük, mint az eredo-t:
      if (i < 60) {
        gyujto += meccsEredmeny[i];
        golInt[i] = gyujto;
      } else {

        gyujto = 0;
        for (int j = i - 60; j < i; ++j) {
          gyujto += meccsEredmeny[j];
          golInt[i] = gyujto;
        }
      }

    }

    // A 3 kapott görbe kiíratása
    for (int i = 0; i < eredo.length; ++i) {

      System.out.println(i + " " + golInt[i] + " " + meccsEredmeny[i] + " " + eredo[i]);

    }

  }

  /*
   Használat (most ugye a szereplő DVSC-re)
    - ennek az osztálynak a kimenetét nyomd át a  data60dvsc nevű fájlba, majd
    - $ R --slave --vanilla <dispdata60dvsc.r
    ahol a dispdata60dvsc.r R szkript a következő:
    
# dispdata60dvsc.r
# 2012. szept. 27.
# Norbert Bátfai
# Kísérletek a gól intenzitás környékén.
# (A gól intenzitás fogalma kapcsán lásd a John Wesson (2002) The Science of Soccer isbn 0750308133 könyvet.)
# A GoalIntensity kimenetének ábrázolása

attach(mtcars)
par(mfrow=c(3,1)) 

adatok<-read.table("data60dvsc")
x <- adatok$V1
y <- adatok$V2
v <- adatok$V3
z <- adatok$V4

plot(x,y, main = "DVSC \"klasszikus\" golintenzitas", sub="2012/13 1-8ford. [60 perces ablakok]x[eredo db]",
xlab="perc", ylab="eredo golok szama/60 elozo perc")
for(i in seq(from=0,to=8*90,by=90)) 
abline(v=i, col = "gold", lwd = 2)

plot(x,v, main = "DVSC lott es kapott golok ideje, arannyal a meccsek", sub="2012/13 1-8ford. [mikor]x[kapott=-1,lott=1]",
xlab="perc", ylab="golok")
for(i in seq(from=0,to=8*90,by=90)) 
abline(v=i, col = "gold", lwd = 2)

plot(x,z, main = "DVSC lott es kapott golok az ido fuggvenyeben", sub="2012/13 1-8ford. [perc]x[db]",
xlab="perc", ylab="golok eredoje")
for(i in seq(from=0,to=8*90,by=90)) 
abline(v=i, col = "gold", lwd = 2)    

   */
  public static void main(String[] args) {

    new GoalIntensity().eredoEs60asAblak(8);
  }
}

(A fenti grafikonokat kell kapnod pdf-ben.)

PLB, PLK

A tavalyi labor mintájára idén is megrendeznénk a bajnokságot és a kupát a kurzusban. Most egy győzelemért 7, egy döntetlenért 4, egy vereségért 2 trófeát adnék (+ extra trófeák az első háromnak a végén), de a pontos számok tekintetében szükségem lenne arra az infóra, hogy hány csapat lenne. Ezért egy kommentben jelezzük a csapatnevet (amely max. két hallgatót takarhat) amellyel neveznénk ezekre az említett tornákra (egy "lájtosított környezetben" megy majd mindkét torna.)

Java esettan.

A forrásokat beszéljük át és a Városi Hangyát teszteljük az LG és a MOTO készüléken.

http://www.inf.unideb.hu/~nbatfai/konyvek/MOBP/mobp.book.xml.html#id465627

Ne feledd, hogy ne a debug release-t töltsd a készülékre, hanem kövesd a fenti linket.

56 komment

A bejegyzés trackback címe:

https://progpater.blog.hu/api/trackback/id/tr714809618

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

j0Co 2012.09.29. 18:21:21

Jól értelmezem, hogy az első lépés két trófeájához elég ha Javában végrehajtok egy kódolást/dekódolást?
Ehhez egy teljesen önálló implementációja kell az algoritmusnak vagy lehet használni a Java-s példát?
(mindenesetre ha elég a példaprogi akkor itt a screenshot h megcsináltam a műveletet:kepfeltoltes.hu/view/120929/exor_www.kepfeltoltes.hu_.jpg )

Chelsea_FC (törölt) 2012.09.29. 22:55:10

Gólintenzitás 1-8. forduló nb1
www13.zippyshare.com/v/91976943/file.html
+96pt

Toma89 2012.09.30. 07:34:22

Feladat: az alábbi Java kód mintájára készítsük el a jelen bajnokság minden csapatának hasonló kartonját! Egy kartonért adok 6 trófeát. A bemenő mérkőzés adatokat az MLSZ megfelelő lapjairól tudod leolvasni.

www32.zippyshare.com/v/2053466/file.html

BFC - 1-9.ford.
DVSC - 1-9-ford.
DVTK - 1-8.ford.
EGRI_FC - 1-9.ford.
FTC - 1-8.ford.
GYOR_ETO - 1-9.ford.
HALADAS - 1-9.ford.
HONVED - 1-9.ford.
KAPOSVAR - 1-9.ford.
KTE - 1-9.ford.
LOMBARD - 1-9.ford.
MTK - 1-9.ford
MVM Paks - 1-9.ford.
PMFC-SPORT - 1-8.ford.
UJPEST - 1-8.ford.
VIDEOTON - 1-9.ford.

thevr 2012.09.30. 22:16:27

A Deadly Team készen áll a bajnokságra és a ligára! (Csapattagok: mamenyaka és én)

phloriaN 2012.10.01. 10:54:06

@nb:
Egy ötlet: ha netalán nem lenne elég csapat, akkor ex-PLB/PLK-s csapatok bevonása hogy meglegyen a keret?

nimuss 2012.10.01. 13:40:43

Az API_doksi csapat jelentkezik a bajnokságra és kupára.

Jómagam és Chelsea_FC :)

nb · http://fersml.blog.hu 2012.10.01. 14:16:44

@phloriaN: nem biztos, hogy ez menne, mert egy módosított szervert használunk, amivel alapban nem is mennek a Java/Atan-os kliensek: www.inf.unideb.hu/~nbatfai/rcssserver-15.1.0.light5.rf.tar.bz2

nb · http://fersml.blog.hu 2012.10.01. 15:22:02

/*
Megoldási vázlat első nekifutásra rögtönözve.
*/

public class ExorToro {

/*

Ebből a részből azt tudod kinyerni, hogyan olvasd be a titkosított fájlt,
a C-hez közeli megoldást tudsz adni ezzel a metódussal:
http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read%28byte[],%20int,%20int%29

public ExorTitkosító(String kulcsSzöveg,
java.io.InputStream bejövőCsatorna,
java.io.OutputStream kimenőCsatorna)
throws java.io.IOException {

byte [] kulcs = kulcsSzöveg.getBytes();
byte [] buffer = new byte[256];
int kulcsIndex = 0;
int olvasottBájtok = 0;

while((olvasottBájtok =
bejövőCsatorna.read(buffer)) != -1) {

for(int i=0; i<olvasottBájtok; ++i) {

buffer[i] = (byte)(buffer[i] ^ kulcs[kulcsIndex]);
kulcsIndex = (kulcsIndex+1) % kulcs.length;

}

kimenőCsatorna.write(buffer, 0, olvasottBájtok);

}

}
*/

/*
A többi rész átírása C-ből már nem fog gondot okozni, mert a main()-ben legyen pl. ez:

1. m.cdn.blog.hu/pr/progpater/image/exor/t3.png mintájára tömbök létrehozása, és
fenti komment segítségével a titkos szöveg beolvasása

2. ciklusok a "kulcstéren":
m.cdn.blog.hu/pr/progpater/image/exor/t4.png

3. az exor megvalósítása, ez is szerepel fentebb

4. a tiszta szövegség ellenőrzésére ez hatékonyabb:
m.cdn.blog.hu/pr/progpater/image/exor/toreshez2.png

public static void main(String[] args) {

try {

new ExorTitkosító(args[0], System.in, System.out);

} catch(java.io.IOException e) {

e.printStackTrace();

}

}
*/
}

det27 2012.10.01. 20:01:17

titkosítás megvolt :)

almatkortet 2012.10.01. 20:07:13

Nevezek a bajnokságba Deviliriummal
csapatnév: Destructor

almatkortet 2012.10.01. 20:07:54

exor kódolás dekódolás laboron 2 trófea

Jockay 2012.10.01. 20:31:12

Trófea nyilvántartás elősegítése céljából jelezném, h a mai H14-es csoportban a CIA feladat harmadik megoldójaként a trófeáim száma nulláról, valósággal kettőre növekedtek :)

Thorles 2012.10.01. 22:55:20

Hétfő 14-16 2 pont az 1-es feladatrészért.

szucs.jani 2012.10.02. 07:04:03

hétfő 14-16 2 pont az otthonról hozott 1. feladatrészért

zacsesz.ceh 2012.10.02. 07:14:11

hétfő 16-18, 1. feladatrész +2 trófea

Chelsea_FC (törölt) 2012.10.02. 08:09:18

Hétfő 14-16. Otthonról hozott feladat. +2pt

nb · http://fersml.blog.hu 2012.10.02. 13:25:51

/* Első nekifutás: formális átírás (kommentezve este lesz a blogon) */

public class ExorToro {

public static final int MAX_TITKOS = 65535;
public static final int OLVASAS_BUFFER = 256;
public static final int KULCS_MERET = 8;

byte[] kulcs = new byte[KULCS_MERET];
byte[] titkos = new byte[MAX_TITKOS];
byte[] tiszta = new byte[MAX_TITKOS];
int titkosMeret;

java.io.OutputStream kimenőCsatorna;

public ExorToro(java.io.InputStream bejövőCsatorna,
java.io.OutputStream kimenőCsatorna)
throws java.io.IOException {

this.kimenőCsatorna = kimenőCsatorna;

byte[] buffer = new byte[OLVASAS_BUFFER];
int olvasottBajtok;
int titkosIndex = 0;

// titkos fajt berantasa
while ((olvasottBajtok = bejövőCsatorna.read (buffer, 0, OLVASAS_BUFFER)) !=-1) {

System.arraycopy(buffer, 0, titkos, titkosIndex, olvasottBajtok);
titkosIndex += olvasottBajtok;
}

titkosMeret = titkosIndex;

for (int i = 0; i < MAX_TITKOS - titkosIndex; ++i)
tiszta[titkosIndex + i] = titkos[titkosIndex + i] = '\0';

// Így tesztelheted, hogy mit is olvastál be:
// (érdemes olvasható szöveggel tesztelni a beolvasást)
// System.out.println(new String(titkos));

}

public void tores() throws java.io.IOException {

byte [] jegyek = new byte [] {'0', '1','2','3','4','5','6','7','8','9'};

// osszes kulcs eloallitasa
for (int ii = 0; ii <= 9; ++ii)
for (int ji = 0; ji <= 9; ++ji)
for (int ki = 0; ki <= 9; ++ki)
for (int li = 0; li <= 9; ++li)
for (int mi = 0; mi <= 9; ++mi)
for (int ni = 0; ni <= 9; ++ni)
for (int oi = 0; oi <= 9; ++oi)
for (int pi = 0; pi <= 9; ++pi)
{
kulcs[0] = jegyek[ii];
kulcs[1] = jegyek[ji];
kulcs[2] = jegyek[ki];
kulcs[3] = jegyek[li];
kulcs[4] = jegyek[mi];
kulcs[5] = jegyek[ni];
kulcs[6] = jegyek[oi];
kulcs[7] = jegyek[pi];

if (exor ()) {
/*
System.out.println(new String(kulcs));
System.out.println(new String(tiszta));
*/
kimenőCsatorna.write(kulcs, 0, KULCS_MERET);
kimenőCsatorna.write(tiszta, 0, titkosMeret);

}
}

}

public boolean exor() {

int kulcs_index = 0;

for (int i = 0; i < titkosMeret; ++i)
{

tiszta[i] = (byte)(titkos[i] ^ kulcs[kulcs_index]);
kulcs_index = (kulcs_index + 1) % KULCS_MERET;

}

return tiszta_lehet ();
}

public boolean tiszta_lehet() {
// a tiszta szoveg valszeg tartalmazza a gyakori magyar szavakat
// illetve az átlagos szóhossz vizsgálatával csökkentjük a
// potenciális töréseket

double szohossz = atlagosSzohossz ();

String tisztaStr = new String(tiszta);

return szohossz > 6.0 && szohossz < 9.0
&& (tisztaStr.indexOf("hogy") != -1)
&& (tisztaStr.indexOf("nem") != -1);
}

public double atlagosSzohossz ()
{
int sz = 0;
for (int i = 0; i < titkosMeret; ++i)
if (tiszta[i] == ' ')
++sz;

return (double)titkosMeret / (double)sz;
}

public static void main(String [] args) {

try {
new ExorToro(System.in, System.out).tores();

} catch (java.io.IOException e) {

e.printStackTrace();

}

}

/* Az itteni kód egy része a konstruktorba, másik része a tores() módszerbe kerül majd.
int
main (void)
{

char kulcs[KULCS_MERET];
char titkos[MAX_TITKOS];
char *p = titkos;
int olvasott_bajtok;

// titkos fajt berantasa
while ((olvasott_bajtok =
read (0, (void *) p,
(p - titkos + OLVASAS_BUFFER <
MAX_TITKOS) ? OLVASAS_BUFFER : titkos + MAX_TITKOS - p)))
p += olvasott_bajtok;

// maradek hely nullazasa a titkos bufferben
for (int i = 0; i < MAX_TITKOS - (p - titkos); ++i)
titkos[p - titkos + i] = '\0';

// osszes kulcs eloallitasa
for (int ii = '0'; ii <= '9'; ++ii)
for (int ji = '0'; ji <= '9'; ++ji)
for (int ki = '0'; ki <= '9'; ++ki)
for (int li = '0'; li <= '9'; ++li)
for (int mi = '0'; mi <= '9'; ++mi)
for (int ni = '0'; ni <= '9'; ++ni)
for (int oi = '0'; oi <= '9'; ++oi)
for (int pi = '0'; pi <= '9'; ++pi)
{
kulcs[0] = ii;
kulcs[1] = ji;
kulcs[2] = ki;
kulcs[3] = li;
kulcs[4] = mi;
kulcs[5] = ni;
kulcs[6] = oi;
kulcs[7] = pi;

if (exor_tores (kulcs, KULCS_MERET, titkos, p - titkos))
printf
("Kulcs: [%c%c%c%c%c%c%c%c]\nTiszta szoveg: [%s]\n",
ii, ji, ki, li, mi, ni, oi, pi, titkos);

// ujra EXOR-ozunk, igy nem kell egy masodik buffer
exor (kulcs, KULCS_MERET, titkos, p - titkos);
}

return 0;
}
*/

}

nimuss 2012.10.02. 15:06:45

Hétfő 14-16
feladat otthonról
+2pt

2012.10.02. 16:07:42

Javás kódtörés laboron

2012.10.02. 16:09:50

Javás kódolás/dekódolás +2p

thevr 2012.10.02. 16:11:01

Kódolás/dekódolás +2pont

devilirium 2012.10.02. 18:30:43

A kódolás/dekódolás nekem is működött, csak nem mutattam órán, mert már csak az utolsó if nem működött a dekódolásban, hogy törje is valóban.

pastebin.com/RsYrzmdq

A kulcs generáláshoz egy más módszert használtam, mint a foros egymásba ágyazás, így azért mégis elegánsabb. Majd még foglalkozok vele kicsit.
További szép estét.

nb · http://fersml.blog.hu 2012.10.02. 18:56:33

@devilirium: ránézésre szép a kód. Sebességteszt az enyémmel, Andráséval összehasonlítva? (jár ezért is pont, lásd Neptun üzim)

Futott ez a laborposzt titkosára? Mert abban nincs "az", a kódban meg éssel nézi azt is. ?

j0Co 2012.10.02. 19:59:39

Hétfő 16-18, kódolás/dekódolás órai megvalósítása +2 trófea :)

nb · http://fersml.blog.hu 2012.10.03. 08:09:22

@mamenyaka: arra gyanakszok, a Tiéd azért gyorsabb, mert
- pár if-el kevesebb van benne (mi történik pl. ha sokkal nagyobb fájt akarsz beolvasni, mint ami a titkos buffered mérete?)

- a tiszta_lehet()-nek megfelelő fgv.-ben csak a szóhosszt ellenőrzöd.

2012.10.03. 10:55:32

@nb: igy van, a tiszta_lehet() egyszerusege sokat csokkent a futasi idon

2012.10.04. 14:34:06

Exor törés CUDAval:
Gondban vagyok a 3 jegyűnél nagyobb kulcsok törésében...

Minden működik látszólg jól, ha csak 3 jegyű a kulcs (000 - 999).

Az exor.cu (pastebin.com/DSBzR2By) a 3 jegyű kulcsos titkosítást fel tudja törni:

$ nvcc -arch=sm_21 exor.cu
$ ./a.out <nagyontitkos
Kulcs: [987]
Tiszta szoveg:
...

(
a nagyontitkos file itt:
www31.zippyshare.com/v/23202425/file.html
)

De ha többjegyű kulcsokkal akarok dolgozni, akkor ez történik:

A CUDA.cu (pastebin.com/3CUHLCU2) program legenerálja és kiírja az összes 4 jegyű (0000 - 9999) kulcsot, töréssel nem foglalkozik.

$ nvcc -arch=sm_21 CUDA.cu
$ ./a.out <nagyontitkos >temp
$ wc -l temp
4096 temp

De amint látható csak 4096ig jut. Sokféleképpen próbálgattam, mindig
ugyanez jött ki. Ha a blokk méretét növeltem 10x10-esre és kiiktattam
a for-t, akkor is csak 4096-ig jut el.

CUDA Device #0
Major revision number: 2
Minor revision number: 1
Name: GeForce GTX 460M
Total global memory: 1610153984
Total shared memory per block: 49152
Total registers per block: 32768
Warp size: 32
Maximum memory pitch: 2147483647
Maximum threads per block: 1024
Maximum dimension 0 of block: 1024
Maximum dimension 1 of block: 1024
Maximum dimension 2 of block: 64
Maximum dimension 0 of grid: 65535
Maximum dimension 1 of grid: 65535
Maximum dimension 2 of grid: 65535
Clock rate: 1350000
Total constant memory: 65536
Texture alignment: 512
Concurrent copy and execution: Yes
Number of multiprocessors: 4
Kernel execution timeout: Yes

2012.10.04. 14:37:37

Az előzőben a linkek a bezáró zárójel ) nélkül működnek.
exor.cu:
pastebin.com/DSBzR2By

CUDA.cu:
pastebin.com/3CUHLCU2

nagyontitkos:
www31.zippyshare.com/v/23202425/file.html

nb · http://fersml.blog.hu 2012.10.04. 16:04:13

@mamenyaka: én egy ilyesmi kódból kiindulva kezdenék el kísérletezni:

// Andras kerdesere az EXOR tores, a
// PARP konyv peldaja alapjan
// (szemiformalis, 4 jegyu kulcsra, sima PIN kod meret)
// hatareset: egy szal - egy tores

#define TITKOS_MERET 2048 // (ebbe belefér a titkos Loki induló :)

__device__ int
exor (int k, int j, char *titkosadat)
{
int kulcs = k*100 + j; // vezeto nullakat is beleirva a kulcs tombbe

// A titkosadat elso TITKOS_MERET bajtja a tenyleges titkos szoveg
// A tiszta szoveget ezen tomb "k+1. soraba" irja, azt vizsgalja, hogy tiszta lett-e

// EXORozas

return 0; //tiszta vagy sem
}

__global__ void
exorkernel (char *titkosadat)
{

int tj = threadIdx.x;
int tk = threadIdx.y;

int j = blockIdx.x * 10 + tj;
int k = blockIdx.y * 10 + tk;

// meg egy plusz elso oszlopot (TITKOS_MERET+1) bevennek a kepzeletbeli tombbe, hogy ott jelezzem, tiszta-e a sor, ezt adhatna vissza a kov. exor device fgv.
exor (j, k, titkosadat);

}

void
cudaexor (char titkosadat[10000+1][TITKOS_MERET+1])
{

char *device_titkosadat;
cudaMalloc ((void **) &device_titkosadat, (10000+1) /*kulcster meret a tisztaknak es a titkos*/ * (TITKOS_MERET+1)/*jelezni, hogy tiszta vagy sem*/ * sizeof (char));
dim3 grid (10, 10);
dim3 tgrid (10, 10);
exorkernel <<< grid, tgrid >>> (device_titkosadat);
cudaMemcpy (titkosadat, device_titkosadat,
(10000+1) /*kulcster meret a tisztaknak es a titkos*/ * (TITKOS_MERET+1)/*jelezni, hogy tiszta vagy sem*/ * sizeof (char), cudaMemcpyDeviceToHost);
cudaFree (device_titkosadat);

}

int
main (int argc, char *argv[])
{
char titkosadat[10000+1][TITKOS_MERET+1];

cudaexor (titkosadat);

}

2012.10.04. 20:15:41

@nb: Próbáltam kipróbálni, de egyszerűen nem szabadulok a Segmentation fault (core dumped) hibától.

#define TITKOS_MERET 2048

int
main ()
{
char titkosadat[10000+1][TITKOS_MERET];
char *device;

cudaMalloc ((void **) &device, 10001*(TITKOS_MERET+1));
cudaFree (device);

return 0;
}

Ennyi kód is ezt a hibát eredményezi. Ha kikommentezem a char titkosadat-ot, akkor működik, vagy ha a cuda-s részeket kommentezem ki, akkor is működik. Együtt a kettő nem...

thevr 2012.10.05. 00:49:24

Brace yourselves! The new Deadly Team is here!

www.youtube.com/watch?v=-b96fT9iE7s

Thorles 2012.10.07. 12:12:54

Lehet rossz helyre írom, de "The twelfth" néven neveznék csapatot a bajnokságba (meg persze majd később a kupába)

nimuss 2012.10.08. 15:09:21

Mandelbrot celebrálás +2p

Sipikee 2012.10.08. 15:16:43

Mandelbrot színezés +3 pont

nimuss 2012.10.08. 15:25:33

Életjáték gyorsítás, lassítás +1p

mamenyaka (törölt) 2012.10.08. 16:25:09

Mit kell kikommentezni az atanos csapatoknál, hogy működjenek a lájtosított szerveren?

nb · http://fersml.blog.hu 2012.10.08. 16:59:50

@mamenyaka: Emlékeim szerint a

src/main/java/atan/parser/Filter.java

forrás

public void run(String cmd, CommandFilter f) {

módszerének végén a

default : // Unknown command
throw new Error("Invalid command'" + cmd + "'");

dobott new Error miatt hal le a light RCSS szerver; ezt kell üresre cserélni:

default : // Unknown command
;

nb · http://fersml.blog.hu 2012.10.08. 17:00:51

@mamenyaka: tehát nem a csapat kódjában, hanem az Atan interfészben kell a módosítás!

mamenyaka (törölt) 2012.10.08. 19:35:03

Valamiért nem akar működni. Átirtam, lefutattam a két mvn parancsot, utána a csapatban is újra kiadtam a mvn parancsot. Sőt, másodjára kitöröltem a mvn repo-ból az atan-t és újracsináltam, meg persze a GoldenTeam-et is kitöröltem és újra.

default : // Unknown command
;
}

Encountered " <NAM> "light "" at line 1, column 6.
Was expecting:
"(" ...

atan.parser.player.ParseException: Encountered " <NAM> "light "" at line 1, column 6.
Was expecting:
"(" ...

at atan.parser.player.CmdParserPlayer.generateParseException(CmdParserPlayer.java:5209)
at atan.parser.player.CmdParserPlayer.jj_consume_token(CmdParserPlayer.java:5067)
at atan.parser.player.CmdParserPlayer.objInfo(CmdParserPlayer.java:418)
at atan.parser.player.CmdParserPlayer.startSeeCommand(CmdParserPlayer.java:395)
at atan.parser.player.CmdParserPlayer.parseSeeCommand(CmdParserPlayer.java:51)
at atan.model.SServerPlayer$SServerCommandBuffer.takeStep(SServerPlayer.java:399)
at atan.model.SServerPlayer.received(SServerPlayer.java:96)
at atan.model.AbstractUDPClient.run(AbstractUDPClient.java:104)

sipitipp · http://www.sportfogadas.ws/author/sipitipp/ 2012.10.08. 20:50:48

Labor : Mandelbrot Halmaz piros színezése 3 kisbajnokság

cccp.flashlight 2012.10.09. 13:21:43

+3 pont Mandelbrothalmaz pirosraszínezésért:D

bensz92 2012.10.09. 13:31:36

3 pont Mandelbrothalmaz színezés

mamenyaka (törölt) 2012.10.09. 17:31:46

+1 laboron életjáték sebesség állításának megtalálása

thevr 2012.10.10. 00:00:17

+3 pont a MandelbrotHalmaz színezéséért. :)

almatkortet 2012.10.10. 11:06:50

+1 laboron életjáték sebesség állításának megtalálása

Thorles 2012.10.12. 18:32:14

+3 pont a MandelbrotHalmaz színezéséért

csigusz86 2012.10.31. 19:01:45

Lehet még jelentkezni a robotfoci bajnokságra?

Ha igen akkor PapoFC jelentkezik.

nb · http://fersml.blog.hu 2012.10.31. 19:23:25

@csigusz86: persze, hiszen eddig csak egyfajta "igényfelmérés" jelleggel csak a szándékot jelezték a hallgatók. A jövő héttől lehet majd nevezni rövid TDP-vel, majd írok részletesen a Neptunon is erről.

csigusz86 2012.10.31. 19:30:41

Azt szeretném még tudni, hogy majd bajnokságban mikért járnak majd pontok? Például csapatom elindítottam ilyenekért? :)
süti beállítások módosítása