Re: Simple Encrypter and Decrypter Class
Gurunath M. wrote:
I am posting a simple Enc and Dec class, which i [sic] was googling for a
long time but didnt find.
Hope this will help some one.
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
You shouldn't use sun.* internal packages. There are standard Java API and
Apache Commons classes that will do this. Also, Base64 is not "encryption".
<http://java.sun.com/products/javamail/javadocs/javax/mail/internet/MimeUtility.html>
<http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html>
Please do not use TAB characters to indent Usenet code posts; it makes them
hard to read. Use spaces, a maximum of four per indent level.
Comments and questions (which differ) inline:
public class EncrypterDecrypter
{
private static final String UNICODE_FORMAT = "UTF8";
public String encrypt( String unencryptedString ) throws
EncryptionException
{
if ( unencryptedString == null || unencryptedString.trim().length()
== 0 )
Why would you trim a string slated for encryption?
throw new IllegalArgumentException(
"Unencrypted string cant be null or empty" );
I suggest that spelling be correct in published code's published messages.
try
{
byte[] keyAsBytes = unencryptedString.getBytes( UNICODE_FORMAT );
BASE64Encoder base64encoder = new BASE64Encoder();
return base64encoder.encode( keyAsBytes );
}
catch (Exception e)
Catching 'Exception' is an antipattern here.
{
throw new EncryptionException( e );
}
}
public String decrypt( String encryptedString ) throws
EncryptionException
{
if ( encryptedString == null || encryptedString.trim().length() <=
0 )
throw new IllegalArgumentException( "Encrypted string cant be null
or empty" );
Why declare a checked exception if you aren't going to use it?
try
{
BASE64Decoder base64decoder = new BASE64Decoder();
byte[] uncr = base64decoder.decodeBuffer( encryptedString );
return toStr( uncr );
}
catch (Exception e)
{
throw new EncryptionException( e );
}
}
private static String toStr( byte[] bytes )
You don't control the character encoding, which means that the "encryption"
and "decryption" aren't symmetrical, you go through a lot of trouble to avoid
using the constructor 'String(byte[])', and you use 'StringBuffer' instead of
'StringBuilder', all mistakes.
{
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < bytes.length; i++)
{
stringBuffer.append( (char) bytes[i] );
}
return stringBuffer.toString();
}
public static class EncryptionException extends Exception
{
public EncryptionException( Throwable t )
{
super( t );
}
}
public static void main (String s[]) throws Exception
'main()' never throws a checked exception - why are you declaring that it does?
{
EncrypterDecrypter ed = new EncrypterDecrypter();
if (s.length != 2)
{
log(" Not enough parameters ");
's' could be longer than 2.
log(" Usage : \n java EncrypterDecrypter 1 <string> \n \t or \n
java EncrypterDecrypter 2 <string> \n \t 1 -> Encryption 2->
Decryption");
System.exit(0);
}
int action = -1;
String str = null;
try
{
action = Integer.parseInt(s[0]);
}
catch(Exception e)
{
log (" Invalid input provided for first param");
System.exit(0);
}
log(" Action to be taken :"+ action);
Use of an 'int' for 'action' is not optimal. Use an enum.
switch(action)
{
case 1:
String encr = ed.encrypt(s[1]);
log(" Encrypted String "+ s[0]+" is : "+ encr);
break;
case 2:
String decr = ed.decrypt(s[1]);
log(" Decrypted String of "+ s[1]+" is : "+ decr);
break;
case 9:
String enc = ed.encrypt(s[1]);
log(" Encrypted String : "+ enc);
String dec = ed.decrypt(enc);
log(" Decrypted String : "+ dec);
break;
default:
log(" Wrong parameter value passed, please check ... ");
break;
}
}
public static void log(String s)
{
System.out.println(s);
This isn't logging. There are two standard logging libraries, one from the
Java API and the other from Apache; use one of those.
}
}
HTH.
--
Lew