Package de.anomic.tools

Source Code of de.anomic.tools.cryptbig

// cryptbig.java
// -------------------------------------
// (C) by Michael Peter Christen; mc@yacy.net
// first published on http://www.anomic.de
// Frankfurt, Germany, 2004
//
// $LastChangedDate: 2011-04-12 07:02:36 +0200 (Di, 12. Apr 2011) $
// $LastChangedRevision: 7649 $
// $LastChangedBy: orbiter $
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

package de.anomic.tools;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.security.Provider;
import java.security.Security;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
import java.util.Random;
import java.util.Set;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

import net.yacy.cora.document.UTF8;
import net.yacy.kelondro.logging.Log;
import net.yacy.kelondro.order.Base64Order;
import net.yacy.kelondro.order.Digest;


public class cryptbig {

    // --------------------------------------------------------
    // Section: random salt generation
    // --------------------------------------------------------

    private static long saltcounter = 0;
    private static Random saltrandom = new Random(System.currentTimeMillis());

    public static String randomSalt() {
        // generate robust 48-bit random number
        final long salt = (saltrandom.nextLong() & 0XffffffffffffL) + (System.currentTimeMillis() & 0XffffffffffffL) + ((1001 * saltcounter) & 0XffffffffffffL);
        saltcounter++;
        // we generate 48-bit salt values, that are represented as 8-character
        // b64-encoded strings
        return Base64Order.standardCoder.encodeLongSB(salt & 0XffffffffffffL, 8).toString();
    }

    // --------------------------------------------------------
    // Section: PBE + PublicKey based on passwords encryption
    // --------------------------------------------------------

    public static final String vDATE = "20030925";
    public static final String copyright = "[ 'crypt' v" + vDATE + " by Michael Christen / www.anomic.de ]";
    public static final String magicString = "crypt|anomic.de|0"; // magic identifier inside every '.crypt' - file
    public static final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMddHHmmssSSS", Locale.ENGLISH);

    String cryptMethod; // one of ["TripleDES", "Blowfish", "DESede", "DES"]
    private static final String defaultMethod = "PBEWithMD5AndDES"; //"DES";

    Cipher ecipher;
    Cipher dcipher;
   
    public cryptbig(final String pbe) {
  // this is possible, but not recommended
  this(pbe, (pbe + "XXXXXXXX").substring(0, 8));
    }

    public cryptbig(final String pbe, final String salt) {
  this(pbe, salt, defaultMethod);
    }


    private cryptbig(final String pbe, String salt, final String method) {
  // a Password-Based Encryption. The SecretKey is created on the fly
  final PBEKeySpec keySpec = new PBEKeySpec(pbe.toCharArray());
  try {
      if (salt.length() > 8) salt = salt.substring(0,8);
      if (salt.length() < 8) salt = (salt + "XXXXXXXX").substring(0,8);
     
      // create the PBE key
      final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(method);
      final SecretKey key = keyFactory.generateSecret(keySpec);

      // create parameter spec for PBE
      final PBEParameterSpec paramSpec = new PBEParameterSpec(UTF8.getBytes(salt), 1000 /*ITERATIONS*/);
       
      // Create a cipher and initialize it for encrypting end decrypting
      cryptMethod = method;
      ecipher = Cipher.getInstance(cryptMethod);
      dcipher = Cipher.getInstance(cryptMethod);
      ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); // paramSpec only for PBE!
      dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
  } catch (final javax.crypto.NoSuchPaddingException e) {
  } catch (final java.security.InvalidKeyException e) {
  } catch (final java.security.NoSuchAlgorithmException e) {
  } catch (final java.security.spec.InvalidKeySpecException e) {
  } catch (final java.security.InvalidAlgorithmParameterException e) {
  }
    }
   
    // Encode a string into a new string using utf-8, crypt and b64
    public String encryptString(final String str) {
  try {
      final byte[] utf = str.getBytes("UTF8");
      final byte[] enc = encryptArray(utf);
      if (enc == null) return null;
      return Base64Order.standardCoder.encode(enc);
  } catch (final UnsupportedEncodingException e) {
  }
  return null;
    }

    // Decode a string into a new string using b64, crypt and utf-8
    public String decryptString(final String str) {
  final byte[] b64dec = Base64Order.standardCoder.decode(str);
    if (b64dec == null) return null; // error in input string (inconsistency)
    final byte[] dec = decryptArray(b64dec);
    if (dec == null) return null;
    return UTF8.String(dec);
    }

    // Encode a byte array into a new byte array
    public byte[] encryptArray(final byte[] b) {
  if (b == null) return null;
  try {
      return ecipher.doFinal(b);
  } catch (final javax.crypto.BadPaddingException e) {
  } catch (final IllegalBlockSizeException e) {
  }
  return null;
    }
   
    // Decode a string into a new string using b64, crypt and utf-8
    public byte[] decryptArray(final byte[] b) {
  if (b == null) return null;
  try {
      return dcipher.doFinal(b);
  } catch (final javax.crypto.BadPaddingException e) {
  } catch (final IllegalBlockSizeException e) {
  }
  return null;
    }


    // This method returns the available implementations for a service type
    public static Set<String> listCryptoMethods(final String serviceType) {
        final Set<String> result = new HashSet<String>();
   
        // All providers
        final Provider[] providers = Security.getProviders();
        for (int i = 0; i < providers.length; i++) {
            // Get services provided by each provider
            final Set<?> keys = providers[i].keySet();
            for (final Iterator<?> it = keys.iterator(); it.hasNext(); ) {
                String key = (String) it.next();
                key = key.split(" ")[0];
                if (key.startsWith(serviceType + ".")) {
                    result.add(key.substring(serviceType.length() + 1));
                } else if (key.startsWith("Alg.Alias." + serviceType + ".")) {
                    // This is an alias
                    result.add(key.substring(serviceType.length() + 11));
                }
            }
        }
        return result;
    }

    public static void testCryptMethods(final Set<String> methods) {
      String method;
      final Iterator<String> i = methods.iterator();
      while (i.hasNext()) {
    method = i.next();
    System.out.print(method + " : ");
    try {
        final cryptbig crypter = new cryptbig("abrakadabra", method);
        final String encrypted = crypter.encryptString("nicht verraten abc 1234567890");
        System.out.print(encrypted + "/");
        final String decrypted = crypter.decryptString(encrypted);
        System.out.println(decrypted);
    } catch (final Exception e) {
        System.out.println("Exception: " + e.getMessage());
        Log.logException(e);
    }
      }
    }

    public void encryptFile(final String inFileName, final String outFileName, final boolean compress) {
  /*
    File-Format of encrypted file:
    Filename: b64-of-encryption-of-<encryption-date: YYYYMMddHHmmSSsss> plus extension ".crypt"
    File Content:
    <original file name>
    <original file date>
    <original file size>
    <compressed-before-encryption-flag>
    <compressed-after-encryption-flag>
    <binary>
  */
  try {
      final File   inFile           = new File(inFileName);
      final String inFileDate       = dateFormatter.format(new Date(inFile.lastModified())); // 17 byte
      final String encryptionDate   = dateFormatter.format(new Date()); // 17 byte
      final String inFileSize       = Base64Order.standardCoder.encodeLongSB(inFile.length(), 11).toString(); // 64 / 6 = 11; 11 byte
      final String flag             = "1"; // 1 byte
      //int    inFileNameLength = inFileName.length(); // 256
      final String X                = inFileDate + encryptionDate + inFileSize + flag + inFileName;

      System.out.println("TEST: preserving inFileDate    : " + dateFormatter.parse(inFileDate, new ParsePosition(0)));
      System.out.println("TEST: preserving encryptionDate: " + dateFormatter.parse(encryptionDate, new ParsePosition(0)));
      System.out.println("TEST: preserving inFileLength  : " + inFile.length());
      System.out.println("TEST: preserving flag          : " + flag);
      System.out.println("TEST: preserving inFileName    : " + inFileName);
      System.out.println("TEST: preserving X-String      : " + X);

      // start encryption
      final InputStream  fin  = new CipherInputStream(new FileInputStream(inFile), ecipher);
      final OutputStream fout = new FileOutputStream(outFileName);

      // write magic and properties of original file
      // - we encrypt the original date, the encryption date, the file size, the flag
      //   and file name together to the string A and calculate the length AL of that string
      // - the length of the file name is therefore equal to AL-(17+17+11+1) = AL-46
      // - AL is then b64-ed and also encrypted which results into string B
      // - the length of B is BL; BL is then b64-ed to a string C of fixed length 1
      // - after the magic String we write C, B and A
      try {
    final String A = UTF8.String(ecipher.doFinal(X.getBytes("UTF8")));
    final String B = UTF8.String(ecipher.doFinal(Base64Order.standardCoder.encodeLongSB(A.length(), 2).toString().getBytes("UTF8"))); // most probable not longer than 4
    final String C = Base64Order.standardCoder.encodeLongSB(B.length(), 1).toString(); // fixed length 1 (6 bits, that should be enough)
    fout.write(UTF8.getBytes(magicString)); // the magic string, used to identify a 'crypt'-file
    fout.write(UTF8.getBytes(C));
    fout.write(UTF8.getBytes(B));
    fout.write(UTF8.getBytes(A));

    // write content of file
    copy(fout, fin, 512);
      }
      catch (final javax.crypto.IllegalBlockSizeException e) {System.err.println("ERROR:" + e.getMessage());}
      catch (final javax.crypto.BadPaddingException e) {System.err.println("ERROR:" + e.getMessage());}
      // finished files
      fin.close();
      fout.close();
  } catch (final FileNotFoundException e) {
      System.err.println("ERROR: file '" + inFileName + "' not found");
  } catch (final IOException e) {
      System.err.println("ERROR: IO trouble");
  }
    }
 
    public void decryptFile(final String inFileName, final String outFileName) {
  InputStream  fin = null;
  OutputStream fout = null;
  try {
      // Start opening the files
      fin  = new BufferedInputStream(new FileInputStream(inFileName), 4096);

      // read the file properties
      final byte[] thisMagic = new byte[magicString.length()];
      fin.read(thisMagic);

      if (!((UTF8.String(thisMagic)).equals(magicString))) {
    // this is not an crypt file, so dont do anything
    fin.close();
    return;
      }
      final byte[] C = new byte[1];
      fin.read(C); // the length of the following String, encoded as b64
      final byte[] B = new byte[(int) Base64Order.standardCoder.decodeLong(UTF8.String(C))];
      fin.read(B); // this is again the length of the following string, as encrypted b64-ed integer
      final byte[] A = new byte[(int) Base64Order.standardCoder.decodeLong(UTF8.String(dcipher.doFinal(B)))];
      fin.read(A);
      final String X = UTF8.String(dcipher.doFinal(A));

      System.out.println("TEST: detecting X-String      : " + X);

      // reconstruct the properties
      final Date   inFileDate     = dateFormatter.parse(X.substring(0, 17), new ParsePosition(0));
      final Date   encryptionDate = dateFormatter.parse(X.substring(17, 34)new ParsePosition(0));
      final long   inFileSize     = Base64Order.standardCoder.decodeLong(X.substring(34, 45));
      final String flag           = X.substring(45, 46);
      final String origFileName   = X.substring(46);

      System.out.println("TEST: detecting inFileDate    : " + inFileDate);
      System.out.println("TEST: detecting encryptionDate: " + encryptionDate);
      System.out.println("TEST: detecting inFileLength  : " + inFileSize);
      System.out.println("TEST: detecting flag          : " + flag);
      System.out.println("TEST: detecting inFileName    : " + origFileName);

      // open the output file
      fout = new BufferedOutputStream(new CipherOutputStream(new FileOutputStream(outFileName), dcipher), 4096);

      // read and decrypt the file
      copy(fout, fin, 512);
     
      // close the files
      fin.close();
      fout.close();

      // do postprocessing
  } catch (final BadPaddingException e) {
      System.err.println("ERROR: decryption of '" + inFileName + "' not possible: " + e.getMessage());
  } catch (final IllegalBlockSizeException e) {
      System.err.println("ERROR: decryption of '" + inFileName + "' not possible: " + e.getMessage());
  } catch (final FileNotFoundException e) {
      System.err.println("ERROR: file '" + inFileName + "' not found");
  } catch (final IOException e) {
      System.err.println("ERROR: IO trouble");
      try { if(fin != null) {
          fin.close();
      }} catch (final Exception ee) {}
      try { if(fout != null) {
          fout.close();
      }} catch (final Exception ee) {}
  }
    }
 
    private static void copy(final OutputStream out, final InputStream in, final int bufferSize) throws IOException {
  final InputStream  bIn  = new BufferedInputStream(in, bufferSize);
  final OutputStream bOut = new BufferedOutputStream(out, bufferSize);
  final byte[] buf = new byte[bufferSize];
  int n;
  while ((n = bIn.read(buf)) > 0) bOut.write(buf, 0, n);
  bIn.close();
  bOut.close();
    }


    public static String scrambleString(final String key, final String s) {
  // we perform several operations
  // - generate salt
  // - gzip string
  // - crypt string with key and salt
  // - base64-encode result
  // - attach salt and return
  final String salt = randomSalt();
  //System.out.println("Salt=" + salt);
  final cryptbig c = new cryptbig(key, salt);
  boolean gzFlag = true;
  byte[] gz = gzip.gzipString(s);
  if (gz.length > s.length()) {
      // revert compression
      try {
    gz = s.getBytes("UTF8");
    gzFlag = false;
      } catch (final UnsupportedEncodingException e) {
    return null;
      }
  }
  //System.out.println("GZIP length=" + gz.length);
  if (gz == null) return null;
  final byte[] enc = c.encryptArray(gz);
  if (enc == null) return null;
  return salt + ((gzFlag) ? "1" : "0") + Base64Order.enhancedCoder.encode(enc);
    }

    public static String descrambleString(final String key, String s) throws IOException {
  final String salt = s.substring(0, 8);
  final boolean gzFlag = (s.charAt(8) == '1');
  s = s.substring(9);
  final cryptbig c = new cryptbig(key, salt);
  final byte[] b64dec = Base64Order.enhancedCoder.decode(s);
  if (b64dec == null) return null; // error in input string (inconsistency)
  final byte[] dec = c.decryptArray(b64dec);
  if (dec == null) return null;
  if (gzFlag) return gzip.gunzipString(dec);
  return UTF8.String(dec);

    }


    // --------------------------------------------------------
    // Section: simple Codings
    // --------------------------------------------------------


    public static String simpleEncode(final String content) {
  return simpleEncode(content, null, 'b');
    }

    public static String simpleEncode(final String content, final String key) {
  return simpleEncode(content, key, 'b');
    }

    public static String simpleEncode(final String content, String key, final char method) {
  if (key == null) key = "NULL";
  if (method == 'p') return "p|" + content;
  if (method == 'b') return "b|" + Base64Order.enhancedCoder.encodeString(content);
  if (method == 'z') return "z|" + Base64Order.enhancedCoder.encode(gzip.gzipString(content));
  if (method == 'c') return "c|" + scrambleString(key, content);
  return null;
    }

    public static String simpleDecode(String encoded, final String key) throws IOException {
  if ((encoded == null) || (encoded.length() < 3)) return null;
  if (encoded.charAt(1) != '|') return encoded; // not encoded
  final char method = encoded.charAt(0);
  encoded = encoded.substring(2);
  if (method == 'p') return encoded;
  if (method == 'b') return Base64Order.enhancedCoder.decodeString(encoded);
  if (method == 'z') return gzip.gunzipString(Base64Order.enhancedCoder.decode(encoded));
  if (method == 'c') return descrambleString(key, encoded);
  return null;
    }


    // --------------------------------------------------------
    // Section: one-way encryption
    // --------------------------------------------------------

    public static String oneWayEncryption(final String key) {
  final cryptbig crypter = new cryptbig(key);
  String e = crypter.encryptString(key);
  if (e.length() == 0) e = "0XXXX";
  if (e.length() % 2 != 0) e += "X";
  while (e.length() < 32) e = e + e;
  final char[] r = new char[16];
  for (int i = 0; i < 16; i++) r[i] = e.charAt(2 * i + 1);
  return new String(r);
    }

    // --------------------------------------------------------
    // Section: command interface
    // --------------------------------------------------------

    private static void help() {
  System.out.println("AnomicCrypt (2003) by Michael Christen");
  System.out.println("Password-based encryption using the " + defaultMethod + "-method in standard java");
  System.out.println("usage: crypt -h | -help");
  System.out.println("       crypt -1 <passwd>");
  System.out.println("       crypt -md5 <file>");
  System.out.println("       crypt ( -es64 | -ds64 | -ec64 | -dc64 ) <string>");
  System.out.println("       crypt ( -e | -d ) <key> <string>");
  System.out.println("       crypt -enc <key> <file>  \\");
  System.out.println("                   [-o <target-file> | -preserveFilename]  \\");
  System.out.println("                   [-d <YYYYMMddHHmmSSsss> | -preserveDate] [-noZip]");
  System.out.println("       crypt -dec <key> <file>  \\");
  System.out.println("                   [-o <target-file> | -preserveFilename]  \\");
  System.out.println("                   [-d <YYYYMMddHHmmSSsss> | -preserveDate]");
  System.out.println("       crypt ( -info | -name | -size | -date | -edate )  \\");
  System.out.println("                   <key> <encrypted-file>");
    }

    private static void longhelp() {
  // --line-help--   *---------------------------------------------------------------
  System.out.println("AnomicCrypt (2003) by Michael Christen");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt -1 <passwd>");
  System.out.println("");
  System.out.println("   One-way encryption of the given password.");
  System.out.println("   The result is computed by encoding the word with the word as");
  System.out.println("   the password and repeating it until the length is greater");
  System.out.println("   than 32. Then every second character is taken to compose the");
  System.out.println("   result which has always the length of 16 characters.");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt -md5 <file>");
  System.out.println("");
  System.out.println("   MD5 digest according to RFC 1321. The resulting bytes are");
  System.out.println("   encoded as two-digit hex and concatenated to a single string.");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt -ec64 <cardinal>");
  System.out.println("");
  System.out.println("   Encoding of a cardianal (a positive long integer) with the");
  System.out.println("   built-in non-standard base-64 algorithm.");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt -dc64 <string>");
  System.out.println("");
  System.out.println("   Decoding of the given b64-coded string to a cardinal number.");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt -es64 <string>");
  System.out.println("");
  System.out.println("   Encoding of a given String to a b64 string.");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt -ds64 <string>");
  System.out.println("");
  System.out.println("   Decoding of a given b64-coded string to a normal string.");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt -e <key> <string>");
  System.out.println("");
  System.out.println("   Encryption of a given Unicode-String.");
  System.out.println("   The given string is first encoded to an UTF-8 byte stream, then");
  System.out.println("   encoded using a password based encryption and then finaly");
  System.out.println("   encoded to b64 to generate a printable form.");
  System.out.println("   The PBE method is " + defaultMethod + ".");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt -d <key> <string>");
  System.out.println("");
  System.out.println("   Decryption of a string.");
  System.out.println("   The string is b64-decoded, " + defaultMethod + "-decrypted, ");
  System.out.println("   and then transformed to an unicode string.");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt -enc <key> <file>  \\");
  System.out.println("            [-o <target-file> | -preserveFilename]  \\");
  System.out.println("            [-d <target-date YYYYMMddHHmmSSsss> | -preserveDate] [-noZip]");
  System.out.println("");
  System.out.println("");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt -dec <key> <file>  \\");
  System.out.println("            [-o <target-file> | -preserveFilename]  \\");
  System.out.println("            [-d <target-date YYYYMMddHHmmSSsss> | -preserveDate]");
  System.out.println("");
  System.out.println("");
  System.out.println("crypt ( -info | -name | -size | -date | -edate ) <key> <encrypted-file>");
  System.out.println("");
  System.out.println("");
    }

    public static void main(final String[] s) {
  if (s.length == 0) {
      help();
      System.exit(0);
  }
  if ((s[0].equals("-h")) || (s[0].equals("-help"))) {
      longhelp();
      System.exit(0);
  }
  if (s[0].equals("-tc")) {
      // list all available crypt mehtods:
      final Set<String> methods = listCryptoMethods("Cipher");
      System.out.println(methods.size() + " crypt methods:" + methods.toString());
      testCryptMethods(methods);
      System.exit(0);
  }
  if (s[0].equals("-random")) {
      final int count = ((s.length == 2) ? (Integer.parseInt(s[1])) : 1);
      for (int i = 0; i < count; i++) System.out.println(randomSalt());
      System.exit(0);
  }
  if (s[0].equals("-1")) {
      if (s.length != 2) {help(); System.exit(-1);}
      System.out.println(oneWayEncryption(s[1]));
      System.exit(0);
  }
  if (s[0].equals("-ec64")) {
      // generate a b64 encoding from a given cardinal
      if (s.length != 2) {help(); System.exit(-1);}
      System.out.println(Base64Order.standardCoder.encodeLongSB(Long.parseLong(s[1]), 0).toString());
      System.exit(0);
  }
  if (s[0].equals("-dc64")) {
      // generate a b64 decoding from a given cardinal
      if (s.length != 2) {help(); System.exit(-1);}
      System.out.println(Base64Order.standardCoder.decodeLong(s[1]));
      System.exit(0);
  }
  if (s[0].equals("-es64")) {
      // generate a b64 encoding from a given string
      if (s.length != 2) {help(); System.exit(-1);}
      System.out.println(Base64Order.standardCoder.encodeString(s[1]));
      System.exit(0);
  }
  if (s[0].equals("-ds64")) {
      // generate a b64 decoding from a given string
      if (s.length != 2) {help(); System.exit(-1);}
      System.out.println(Base64Order.standardCoder.decodeString(s[1]));
      System.exit(0);
  }
  if (s[0].equals("-ess")) {
      // 'scramble' string
      if (s.length != 3) {help(); System.exit(-1);}
      final long t = System.currentTimeMillis();
      System.out.println(scrambleString(s[1], s[2]));
      System.out.println("Calculation time: " + (System.currentTimeMillis() - t) + " milliseconds");
      System.exit(0);
  }
  if (s[0].equals("-dss")) {
      // 'descramble' string
      if (s.length != 3) {help(); System.exit(-1);}
      final long t = System.currentTimeMillis();
      try {
            System.out.println(descrambleString(s[1], s[2]));
        } catch (final IOException e) {
            // TODO Auto-generated catch block
            Log.logException(e);
        }
      System.out.println("Calculation time: " + (System.currentTimeMillis() - t) + " milliseconds");
      System.exit(0);
  }
  if (s[0].equals("-e")) {
      if (s.length != 3) {help(); System.exit(-1);}
      System.out.println((new cryptbig(s[1])).encryptString(s[2]));
      System.exit(0);
  }
  if (s[0].equals("-d")) {
      if (s.length != 3) {help(); System.exit(-1);}
      System.out.println((new cryptbig(s[1])).decryptString(s[2]));
      System.exit(0);
  }
  if (s[0].equals("-md5")) {
      // generate a public key from a password that can be used for encryption
      if (s.length != 2) {help(); System.exit(-1);}
      String md5s = "";
        try {
            md5s = Digest.encodeMD5Hex(new File(s[1]));
        } catch (IOException e) {
            e.printStackTrace();
        }
      System.out.println(md5s);
      System.exit(0);
  }
  if (s[0].equals("-enc")) {
      if ((s.length < 3) || (s.length > 4)) {help(); System.exit(-1);}
      String target;
      if (s.length == 3) target = s[2] + ".crypt"; else target = s[3];
      (new cryptbig(s[1])).encryptFile(s[2], target, true /*compress*/);
      System.exit(0);
  }
  if (s[0].equals("-dec")) {
      if ((s.length < 3) || (s.length > 4)) {help(); System.exit(-1);}
      String target;
      if (s.length == 3) {
    if (s[2].endsWith(".crypt"))
        target = s[2].substring(0, s[2].length() - 7);
    else
        target = s[2] + ".decoded";
      } else {
    target = s[3];
      }
      (new cryptbig(s[1])).decryptFile(s[2], target);
      System.exit(0);
  }
  help(); System.exit(-1);
    }

}
TOP

Related Classes of de.anomic.tools.cryptbig

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.