Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
    * JBoss, Home of Professional Open Source
    * Copyright 2005, JBoss Inc., and individual contributors as indicated
    * by the @authors tag. See the copyright.txt in the distribution for a
    * full listing of individual contributors.
    *
    * This is free software; you can redistribute it and/or modify it
    * under the terms of the GNU Lesser General Public License as
    * published by the Free Software Foundation; either version 2.1 of
   * the License, or (at your option) any later version.
   *
   * This software 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
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with this software; if not, write to the Free
   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
   */
 package org.jboss.remoting.marshal.encryption;
 
 import  EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap;
 import  org.jboss.logging.Logger;
 
 import java.util.Map;
 
 //$Id: EncryptionManager.java 1398 2006-08-25 21:09:03Z asaldhana $
 
Manager that deals with the generation of the Cipher Mode: ECB: Electronic Codebook Mode (NIST FIPS PUB 81) CBC: Cipher Block Chaining Mode(NIST FIPS PUB 81) PCBC: Plaintext Cipher Block Chaining (Kerberos) CFB: Cipher Feedback Mode (NIST FIPS PUB 81) OFB: Output Feedback Mode (NIST FIPS PUB 81) Padding: NoPadding: No padding. PKCS5Padding: RSA, "PKCS #5: Password-Based Encryption Standard," version 1.5, Nov 1993.

Author(s):
Anil Saldhana
Version:
$Revision: 1398 $
Since:
Aug 11, 2006
 
 public class EncryptionManager
 {
    private static Logger log = Logger.getLogger(EncryptionManager.class);
    private static Map keys =  new ConcurrentHashMap();
 
    private static byte[] salt8 = {
       (byte)0x7e, (byte)0xee, (byte)0xc8, (byte)0xc7,
       (byte)0x99, (byte)0x73, (byte)0x21, (byte)0x8c};
 
    private static byte[] salt16 = {
       (byte)0x7e, (byte)0xee, (byte)0xc8, (byte)0xc7,
       (byte)0x99, (byte)0x73, (byte)0x21, (byte)0x8c,
       (byte)0x7e, (byte)0xee, (byte)0xc8, (byte)0xc7,
       (byte)0x99, (byte)0x73, (byte)0x21, (byte)0x8c};
 
    private static IvParameterSpec iv8 = new IvParameterSpec();
 
    private static IvParameterSpec iv16 = new IvParameterSpec();
 
    
    public static final String TRIPLEDES = "DESede";
    public static final String DES = "DES";
    public static final String AES = "AES";
    public static final String BLOWFISH = "Blowfish";
    public static final String RC4 = "RC4"
 
    public static final String DEFAULT_CIPHER_ALGORITHM = ;
 
    static
    {
       //Generate Keys for the common algorithms
       try
       {
          .put("AES"loadKey());
          .put("DES"loadKey());
          .put("DESede"loadKey());
          .put("Blowfish"loadKey());
          .put("RC4"loadKey());
       }
       catch (Exception e)
       {
          if(.isTraceEnabled())
             .trace("Exception in loading key",e);
       }
    }

   
Generate a Cipher

Parameters:
mode Cipher.ENCRYPT_MODE or Cipher.DECRYPT_MODE (Wrap/Unwrap not supported)
algo Cipher Algorithm
Returns:
cipher
   public static Cipher getCipher(int modeString algo)
   {
      if(algo == null)
         algo = ;
      Cipher cipher = null;
      boolean correctMode = (mode == .
                || mode == .);
      if(!correctMode)
         throw new IllegalArgumentException("Cipher Mode is wrong");
       try
      {
         cipher = Cipher.getInstance(algo);
         Key key = (Key).get(canonicalize(algo));
         if(key == null)
            throw new IllegalStateException("Key is null for algo="+algo);
         initializeCipher(cipher,key,algo,mode);
      }
      catch (Throwable e)
      {
         .error("getCipher failed"e);
      }
       return cipher;
   }

   
Obtain an initialized cipher given the Cipher mode, algorithm and key

Parameters:
mode Cipher.ENCRYPT_MODE or Cipher.DECRYPT_MODE
algo
key
Returns:
initialized cipher
   public static Cipher getCipher(int modeString algoKey key)
   {
      Cipher cipher = null;
      boolean correctMode = (mode == .
                || mode == .);
      if(!correctMode)
         throw new IllegalArgumentException("Cipher Mode is wrong");
       try
      {
         cipher = Cipher.getInstance(algo);
         initializeCipher(cipher,key,algo,mode);
      }
      catch (Throwable e)
      {
         if(.isTraceEnabled())
            .trace("getCipher failed:"e);
      }
       return cipher;
   }

   
Load the serialized key

Parameters:
algo
Returns:
Throws:
Exception
   private static Key loadKey(String algothrows Exception
   {
      ClassLoader tcl = Thread.currentThread().getContextClassLoader();
      String file = "org/jboss/remoting/marshall/encryption/"+algo+".key";
      InputStream is = tcl.getResourceAsStream(file);
      if(is == null)
         throw new IllegalStateException("Key file is not locatable");
      ObjectInput out = new ObjectInputStream(is);
      Key key = (Key)out.readObject();
      out.close();
      return key;
   }
   //Remove padding etc from the key algo
   private static String canonicalize(String algo)
   {
      if(algo == null)
         throw new IllegalArgumentException("Null algorithm passed");
      String result = algo;
      if(algo.indexOf("/")> 0)
      {
         result = algo.substring(0,algo.indexOf("/"));
      }
      return result;
   }

   
Initialize the Cipher

Parameters:
cipher Cipher
key Key
algo Algorithm
mode Cipher Mode
Throws:
Exception
   private static void initializeCipher(Cipher cipherKey keyString algoint mode)
   throws Exception
   {
      //No Padding required
      if(algo.equals("AES") || algo.equals("DES") || algo.equals("DESede") ||
            algo.equals("RC4") || algo.equals("Blowfish"))
         cipher.init(modekey);
      else
      if(algo.indexOf("AES") == 0 && algo.indexOf("AES/ECB") < 0 )
         cipher.init(modekey,);
      else
      if(algo.indexOf("/CBC/") > 0 || algo.indexOf("/OFB/") > 0 ||
            algo.indexOf("/PCBC/") > 0 || algo.indexOf("/CFB/") > 0)
         cipher.init(modekey,);
      else
         cipher.init(modekey);
   }
New to GrepCode? Check out our FAQ X