package org.openswing.swing.permissions.java; import javax.crypto.*; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import java.security.*; import java.util.*; /** * <p>Title: OpenSwing Framework</p> * <p>Description: Utility class used to crypt and decrypt of bytes. * This class can be used by LoginDialog class to encode/decode the password field. * This class can be used by any other layer: there are two initializers, based on "getInstance" method; * - getInstance() initializes the internal cipher by providing a default internal password * - getInstance(String passwd) initializes the internal cipher by providing an application defined password</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * * <p> This file is part of OpenSwing Framework. * This library is free software; you can redistribute it and/or * modify it under the terms of the (LGPL) Lesser General Public * License as published by the Free Software Foundation; * * GNU LESSER GENERAL PUBLIC LICENSE * Version 2.1, February 1999 * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * The author may be contacted at: * maurocarniel@tin.it</p> * * @author Mauro Carniel * @version 1.0 */ public class CryptUtils { /** unique instance of the class */ private static CryptUtils cryptUtils = null; /** cipher used to encode bytes, based on PBEWithMD5AndDES algorithm */ private Cipher encodeCipher = null; /** cipher used to decode bytes, based on PBEWithMD5AndDES algorithm */ private Cipher decodeCipher = null; private CryptUtils(String passwd) { try { char[] chars = new char[passwd.length()]; for(int i=0;i<chars.length;i++) chars[i] = passwd.charAt(i); PBEKeySpec pbeKeySpec = new PBEKeySpec(chars); SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec); // Create PBE encode Cipher encodeCipher = Cipher.getInstance("PBEWithMD5AndDES"); // Salt byte[] salt = { (byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c, (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99 }; // Iteration count int count = 20; // Create PBE parameter set PBEParameterSpec encodePbeParamSpec = new PBEParameterSpec(salt, count); // Initialize PBE encode Cipher with key and parameters encodeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, encodePbeParamSpec); // Create PBE decode Cipher decodeCipher = Cipher.getInstance("PBEWithMD5AndDES"); // Create PBE parameter set PBEParameterSpec decodePbeParamSpec = new PBEParameterSpec(salt, count); // Initialize PBE decode Cipher with key and parameters decodeCipher.init(Cipher.DECRYPT_MODE, pbeKey, decodePbeParamSpec); } catch (NoSuchPaddingException ex) { } catch (Exception ex) { ex.printStackTrace(); } } /** * @return unique instance of this class */ public static CryptUtils getInstance() { if (cryptUtils==null) cryptUtils = new CryptUtils("openswing"); return cryptUtils; } /** * @param passwd password used to initialize the encryption/decryption cipher * @return unique instance of this class */ public static CryptUtils getInstance(String passwd) { if (cryptUtils==null) cryptUtils = new CryptUtils(passwd); return cryptUtils; } /** * @param clearBytes bytes to encode * @return encoded bytes */ public final byte[] encodeBytes(byte[] clearBytes) throws Throwable { return encodeCipher.doFinal(clearBytes); } /** * @param encodedBytes bytes to decode * @return decoded bytes */ public final byte[] decodeBytes(byte[] encodedBytes) throws Throwable { return decodeCipher.doFinal(encodedBytes); } /** * @param clearText text to encode * @return encoded text as bytes */ public final byte[] encodeText(String clearText) throws Throwable { return encodeCipher.doFinal(clearText.getBytes()); } /** * @param encodedBytes bytes to decode as text * @return decoded text */ public final String decodeText(byte[] encodedBytes) throws Throwable { return new String(decodeCipher.doFinal(encodedBytes)); } }