Blowfish Rundenanzahl angeben?

Tyrant_re

Neues Mitglied
Hi,
Progge jetze seit 3 Jahren mit Java und jetzt ist es das erste mal das ich durch google nicht mehr weiter gekommen bin. Also hab ich mich spontan mal angemeldet^^
Ich beschäftige mich momentan mit Blowfish als verschlüsselung.
Dazu hab ich schonmal nen sehr schönen Quellcode zum Thema gefunden:

http://www.java-forum.org/datenbankprogrammierung/89295-db-passwort-symetrisch-verschluesseln.html
Java:
/**
 * Beispiel für die Implementierung des Blowfisch-Algorithmus.
 * 
 * @author Markus Kopp
 * @version 1.0
 */
public class Blowfish {
 
  protected Cipher cipher;
 
  protected IvParameterSpec ivSpec;
 
  protected SecretKeySpec keySpec;
 
  /**
   * Erzeugt ein neues Blowfish-Objekt zum Ver-/Entschlüsseln
   * 
   * @param key
   *            der zu verwendende Schlüssel (muss 16 bytes lang sein)
   * @throws Exception
   *             wenn das Erzeugen fehl schlug
   */
  public Blowfish(String key) throws Exception {
    ivSpec = null;
    keySpec = null;
    try {
      cipher = Cipher.getInstance("Blowfish/CBC/NoPadding");
      setKey(key.getBytes());
      setDefaultIV();
    } catch (Exception e) {
      cipher = null;
      throw new Exception("Blowfish konnte nicht initialisiert werden.",
          e);
    }
  }
 
  /**
   * Setze den zu verwendenden Schlüssel
   * 
   * @param key
   *            der Schlüssel
   */
  public void setKey(byte[] key) {
    keySpec = new SecretKeySpec(key, "Blowfish");
  }
 
  /**
   * Setzt den IV vector
   * 
   * @param b
   *            der IV vector
   */
  public void setIV(byte[] b) {
    ivSpec = new IvParameterSpec(b);
  }
 
  /**
   * Verschlüsselt den übergebenen Text
   * 
   * @param text
   *            the text to encryt
   * @return den verschlüsselten Text als Byte-Array
   * @throws InvalidKeyException
   * @throws InvalidAlgorithmParameterException
   * @throws IllegalBlockSizeException
   * @throws BadPaddingException
   */
  public byte[] encrypt(String text) throws InvalidKeyException,
      InvalidAlgorithmParameterException, IllegalBlockSizeException,
      BadPaddingException {
    byte[] blocks = padWithSpaces(text).getBytes();
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
    return cipher.doFinal(blocks);
  }
 
  /**
   * Entschlüsselt das übergebene Byte-Array
   * 
   * @param blocks
   *            das Byte-Array
   * @return der entschlüsselte Text
   * @throws InvalidKeyException
   * @throws InvalidAlgorithmParameterException
   * @throws IllegalBlockSizeException
   * @throws BadPaddingException
   */
  public byte[] decrypt(byte[] blocks) throws InvalidKeyException,
      InvalidAlgorithmParameterException, IllegalBlockSizeException,
      BadPaddingException {
    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
    return cipher.doFinal(blocks);
  }
 
  private String padWithSpaces(String clearText) {
    String result = clearText;
    if (clearText != null && clearText.length() % 8 != 0) {
      StringBuffer buffer = new StringBuffer();
      buffer.append(clearText);
      while (buffer.length() % 8 != 0) {
        buffer.append(' ');
      }
      result = buffer.toString();
    }
    return result;
  }
 
  private void setDefaultIV() {
    byte[] tmp_iv = new java.math.BigInteger("FEDCBA9876543210", 16)
        .toByteArray();
    byte[] iv = new byte[8];
    System.arraycopy(tmp_iv, 1, iv, 0, 8);
    setIV(iv);
  }
 
  /* ************************************************************************* */
  /* ************************************************************************* */
 
  /**
   * Beispiel für die Verwendung des Blowfish-Algorithmus.<br>
   * Wenn ein Parameter übergeben wird, wird dieser als Text zum Verschlüsseln
   * verwendet.
   * 
   * @param args
   *            optional Parameter
   */
  public static void main(String[] args) throws Exception {
 
    if (args.length == 2) {
      // baue Text zusammen:
      String key = args[0];
      String text = args[1];
      
      Blowfish blowfish = new Blowfish(key);
 
      System.out.println("\nTo decode: " + text);
      byte[] enc = blowfish.encrypt(text);
      char[] hexEncoded = Hex.encodeHex(enc);
      String verschluesselt = new String(hexEncoded);
      System.err.println("\n  decoded: " + verschluesselt);
 
      // entschlüsseln
      byte[] res = blowfish.decrypt(Hex.decodeHex(verschluesselt
          .toCharArray()));
      System.err.println("\n  encoded: " + new String(res));
    } else {
      System.err.println("usage: java -jar Blowfish.jar [key] [text]");
    }
 
  }
}

Nun frag ich mich wie man die Rundenanzahl fest legt. Standart sind ja 16. Ich würde allerdings gerne den User bestimmen lassen wie viele Runden er machen soll. Ich hab auchmal irgendwo gelesen das 12 Runden z.B. noch unsicher sind.

Eigentlich müsste man ja bei cipher.init() die Rundenanzahl mit geben können. Finde aber leider nichts dazu.

Danke schonmal an jeden der Helfen will :)
 

Tyrant_re

Neues Mitglied
mmh, hat dann vielleicht einer noch nen Quellcode ausn Studium oder so, wo er vielleicht den Algorythmus selbst nach Programmiert hat?
 

Ähnliche Java Themen


Oben