I am using Jasypt for encryption. This is my code:
public class Encryptor { private final static StandardPBEStringEncryptor pbeEncryptor = new StandardPBEStringEncryptor(); private final static String PASSWORD = "FBL"; private final static String ALGORITHM = "PBEWithMD5AndTripleDES"; static{ pbeEncryptor.setPassword( PASSWORD ); //pbeEncryptor.setAlgorithm( ALGORITHM ); } public static String getEncryptedValue( String text ){ return pbeEncryptor.encrypt( text ); } public static String getDecryptedValue( String text ){ return pbeEncryptor.decrypt( text ); } }
Uncomment the setAlgorithm
line and it will throw an exception
org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an excep tion. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Ex tension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine
api says:
Sets the algorithm to be used for encryption Sets the algorithm to be used for encryption, like PBEWithMD5AndDES.
This algorithm has to be supported by your JCE provider (if you specify one, or the default JVM provider if you don’t) and, if it is supported, you can also specify mode and padding for it, like ALGORITHM/MODE/PADDING.
Now, when you comment ‘setAlgorithm’ it will use the default Algorithm [ i guess it is md5 ], and it will work fine. That means md5 is supported by my JVM. Now, how to find out what other encryption algorithms are supported by my JVM.
Thanks,
Advertisement
Answer
The following will list all the providers and the algorithms supporter. What version of Java are you using? Unless you’re on an old version JCE should be included as standard.
import java.security.Provider; import java.security.Security; public class SecurityListings { public static void main(String[] args) { for (Provider provider : Security.getProviders()) { System.out.println("Provider: " + provider.getName()); for (Provider.Service service : provider.getServices()) { System.out.println(" Algorithm: " + service.getAlgorithm()); } } } }
Edit: Any reason why you don’t use the standard stuff from the javax.crypto package?
1) Generate a Key
using
Key key = SecretKeyFactory.getInstance(algorithm).generateSecret(new PBEKeySpec(password.toCharArray()));
2) Create a Cipher
using
cipher = Cipher.getInstance(algorithm);
3) Init your cipher with the key
cipher.init(Cipher.ENCRYPT_MODE, key);
4) Do the encrypting with
byte[] encrypted = cipher.doFinal(data)