Signatur

Created: 2014-05-18 15:22
Updated: 2014-05-25 21:08

ReadMe.md

Komplexpraktikum Kryptographie und Datensicherheit

Versuch 5: Digitale Signatursysteme (15.05.)

####1. Aufgabe1 Signieren von Nachrichten mit RSA.

  1. Signatur
public BigInteger sign(RSAPrivateKey privKey, BigInteger m){
  try{
      BigInteger p = privKey.p;
      BigInteger q = privKey.q;
      BigInteger n = privKey.n;
      BigInteger dp = privKey.dp;
      BigInteger dq = privKey.dq;
      BigInteger sigp;
      BigInteger sigq;
      BigInteger sig;

      sigp = m.modPow(dp, p);
      sigq= m.modPow(dq, q);
      BigInteger mods[] = new BigInteger[] {p,q};
      BigInteger reste[] = new BigInteger[] {sigp,sigq};
      CRA cra = new CRA(reste, mods);
      cra.executeCRA();
      sig=cra.getErgebnis();

      return sig;

      }catch (Exception e){
        System.out.println("RSA.sign: "+e.getMessage());
        e.printStackTrace();
      }
      return null;
  }
  1. Test
public boolean test(RSAPublicKey pubKey, BigInteger m, BigInteger sig){

    BigInteger e = pubKey.e;
    BigInteger n = pubKey.n;
    boolean hit = false;
    BigInteger t;
    
    t = sig.modPow(e, n);
    
    if(t.compareTo(m) == 0){
      hit = true;
    }
  }
  ````

####2. Aufgabe2
Aktiver Angriff von DENNING
````java
public Aufgabe2(){
try{
    System.out.println(messages.getString("Aufgabe2RSAAtt")+" "
           +messages.getString("Aufgabe2RSADenn"));

    /* Schlüssel generieren */
    RSAKeyGenerator kGen = new RSAKeyGenerator(500 /* Schlüssellänge */);

    /** Signierschlüssel */
    RSAPrivateKey opferPrivKey = kGen.getPrivateKey();

    /** Testschlüssel */
    RSAPublicKey opferPubKey = kGen.getPublicKey();

    //Simulation (Opfer)
    BigInteger x = BigInteger.valueOf(45);
    RSA myRSA = new RSA();
    BigInteger sigX = myRSA.sign(opferPrivKey, x);

    //Angreifer
    BigInteger m = BigInteger.valueOf(666);
    BigInteger xm = m.multiply(x);

    //Opfer
    BigInteger sigXM = myRSA.sign(opferPrivKey,xm);

    //Angreifer
    BigInteger invSigX = sigX.modInverse(opferPubKey.n);
    BigInteger sigM = invSigX.multiply(sigXM);

    //Test von der Signatur
    if(myRSA.test(opferPubKey, m, sigM)){
      System.out.println("richtig!!");
      }else{
      System.out.println("Falsch!!");
      }

    }catch(Exception e){
      System.out.println(messages.getString("Aufgabe2A2")+" "+e.getMessage());
    e.printStackTrace();
    }
}

####3. Aufgabe3 DAMGARD-Hashfunktion

public BigInteger hash(DamgardKey key, BigInteger m){
  try{
      BigInteger A0 = BigInteger.valueOf(1);
      BigInteger A1 = BigInteger.valueOf(4);
      BigInteger N = key.n;
      BigInteger R = key.r;

      BigInteger hashValue = R;

      BigInteger praefixfreiM = praefixfreiMessage(m);

      int lenM = praefixfreiM.bitLength();

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

          BigInteger mi = praefixfreiM.setBit(i);

          if (mi.compareTo(praefixfreiM) == 0) {
            hashValue = A1.multiply(hashValue.multiply(hashValue)).mod(N);
          }else {
            hashValue = A0.multiply(hashValue.multiply(hashValue)).mod(N);
          }

      }

      return hashValue;

      } catch (Exception e){
          System.out.println("Damgard.hash: "+e.getMessage());
          e.printStackTrace();
      }
      
      return null;
}

####4. Aufgabe4 Signierfunktion von GMR

public BigInteger sign(GMRPrivateKey privKey, BigInteger m, BigInteger r){ 
  try{ 
 
      BigInteger praefixfreiM = invertMessage(praefixfreiMessage(m));
      BigInteger sig = r;
       
      for (int i = 0; i < praefixfreiM.bitLength(); i++) {
        
        if (!QRn(privKey.p, privKey.q, sig)) {
          sig = sig.negate().mod(privKey.n);
        }
      
      if (praefixfreiM.testBit(i)) {

        BigInteger mods[] = new BigInteger[] {privKey.p,privKey.q};
        BigInteger reste[] = new BigInteger[] {privKey.inv4p, privKey.inv4q};
        CRA cra = new CRA(reste, mods);
        cra.executeCRA();
        BigInteger inv4n = cra.getErgebnis();
          
        sig = sig.multiply(inv4n);
      }
      
      BigInteger yp = sig.modPow(privKey.expp, privKey.p);
      BigInteger yq = sig.modPow(privKey.expq, privKey.q);
      
      BigInteger mods[] = new BigInteger[] {privKey.p,privKey.q};
      BigInteger reste[] = new BigInteger[] {yp, yq};
      CRA cra = new CRA(reste, mods);
      cra.executeCRA();
      sig = cra.getErgebnis();
        
      if (sig.compareTo(privKey.n.divide(BigInteger.valueOf(2))) != -1 ) {
        sig = sig.negate().mod(privKey.n);
      }
    }
       
      return sig;

    }catch (Exception e){ 
        System.out.println("GMR.sign: "+e.getMessage()); 
        e.printStackTrace(); 
    } 
    return null; 
  } 
Cookies help us deliver our services. By using our services, you agree to our use of cookies Learn more