public void sendFirst() {
    System.out.println("-- Alice --");
    if (betray) {
      System.out.println("ACHTUNG: Betrugsmodus aktiv!!!");
    }

    // Hard coded messages M_0 and M_1
    BigInteger[] M = new BigInteger[2];
    M[0] = new BigInteger("11111111111111111111111111111111111111111111111111111111111");
    M[1] = new BigInteger("22222222222222222222222222222222222222222222222222222222222");

    if (betray) {
      M[1] = M[0];
    }

    // Hard coded ElGamal
    BigInteger p_A = new BigInteger("7789788965135663714690749102453072297748091458564354001035945418057913886819451721947477667556269500246451521462308030406227237346483679855991947569361139");
    BigInteger g_A = new BigInteger("6064211169633122201619014531987050083527855665630754543345421103270545526304595525644519493777291154802011605984321393354028831270292432551124003674426238");
    BigInteger y_A = new BigInteger("3437627792030969437324738830672923365331058766427964788898937390314623633227168012908665090706697391878208866573481456022491841700034626290242749535475902");
    // private:
    BigInteger x_A = new BigInteger("3396148360179732969395840357777168909721385739804535508222449486018759668590512304433229713789117927644143586092277750293910884717312503836910153525557232");
    // Objekt initialisieren mit priv key
    ElGamal elGamal_A = new ElGamal(p_A, g_A, y_A, x_A);
    
    BigInteger p = elGamal_A.p;

    // Alice sendet ElGamal public key an Bob
    Com.sendTo(1, elGamal_A.p.toString(16)); // S1
    Com.sendTo(1, elGamal_A.g.toString(16)); // S2
    Com.sendTo(1, elGamal_A.y.toString(16)); // S3

    // Alice wählt zufällig zwei Nachrichten m_0, m_1 in Z_p, 1 <= m < p
    BigInteger[] m = new BigInteger[2];
    m[0] = BigIntegerUtil.randomBetween(ONE, p);
    m[1] = BigIntegerUtil.randomBetween(ONE, p);
    System.out.println("m_0: " + m[0]);
    System.out.println("m_1: " + m[1]);

    // Alice sendet m_0, m_1 an Bob
    Com.sendTo(1, m[0].toString(16)); // S4
    Com.sendTo(1, m[1].toString(16)); // S5

    // Alice empfängt q
    BigInteger q = new BigInteger(Com.receive(), 16); // R6

    // Alice berechnet k_0', k_1', hier k_A[0] und k_A[1] genannt
    BigInteger[] k_strich = new BigInteger[2];
    for (int i = 0; i < 2; i++) {
      k_strich[i] = elGamal_A.decipher((q.subtract(m[i])).mod(p.multiply(p))); // D_A((q-m_i) mod p^2)
    }
    System.out.println("k_strich[0]: " + k_strich[0]);
    System.out.println("k_strich[1]: " + k_strich[1]);

    // zufällig s wählen
    int s = BigIntegerUtil.randomBetween(ZERO, TWO).intValue();
    System.out.println("s: " + s);

    BigInteger[] send = new BigInteger[2];
    send[0] = M[0].add(k_strich[s]).mod(p);
    send[1] = M[1].add(k_strich[s ^ 1]).mod(p);

    System.out.println("send_0: " + send[0]);
    System.out.println("send_1: " + send[1]);

    int r = -1;
    if (betray) { // try to find right r :D
      r = BigIntegerUtil.randomBetween(ZERO, TWO).intValue();
      System.out.println("guessed r: " + r);
    }

    // Signatur berechnen
    BigInteger[] S = new BigInteger[2];
    for (int i = 0; i < 2; i++) {
      if (betray) {
        if (i == r) { // gefälschte signatur
          S[i] = BigIntegerUtil.randomBetween(BigIntegerUtil.TWO, p.multiply(p));
        } else {
          S[i] = elGamal_A.sign(k_strich[i]);
        }
      } else { // no betraying
        S[i] = elGamal_A.sign(k_strich[i]);
      }
    }
    System.out.println("S_0: " + S[0]);
    System.out.println("S_1: " + S[1]);

    // Alice sendet send_0, send_1, s, S[0], S[1]
    Com.sendTo(1, send[0].toString(16)); // S7
    Com.sendTo(1, send[1].toString(16)); // S8
    Com.sendTo(1, s + ""); // S9
    Com.sendTo(1, S[0].toString(16)); // S10
    Com.sendTo(1, S[1].toString(16)); // S11
  }