Muralidharan
Muralidharan

Reputation: 17

NoSuchAlgorithm exception while using cipher.getInstance method

I am doing password decription logic using cipher java. In that, while getting the instance of cipher using cipher.getInstance("RSA/NONE/NoPadding"). I am getting following exception: NoSuchAlgorithm.

The same code is working in my local jboss server setup but not working in IBM-WAS server setup. Is there any difference between local jboss Server and WAS Server?

public static String decrypt(String encrypted, KeyPair keys) {
    Cipher dec;
    try {

        dec = Cipher.getInstance("RSA/NONE/NoPadding"); //Exception raised
        dec.init(Cipher.DECRYPT_MODE, keys.getPrivate());

    } catch (GeneralSecurityException e) {
        throw new RuntimeException("RSA algorithm  not supported", e);//Catch block executed
    }
}

Log:

R Caused by: java.security.NoSuchAlgorithmException: Cannot find any provider supporting RSA/NONE/NoPadding
    at java.lang.Throwable.<init>(Throwable.java:80)
    at javax.crypto.Cipher.getInstance(Unknown Source)
    at com.lsi.utils.JCryptionUtil.decrypt(JCryptionUtil.java:59)
    Caused by: java.security.NoSuchAlgorithmException: Mode: NONE not implemented
    at com.ibm.crypto.provider.RSA.engineSetMode(Unknown Source)
    at javax.crypto.Cipher$a_.a(Unknown Source)

**Jar**

Jce.jar - javax.crypto.Cipher;
bcprov-jdk15-140.jar (External security provider jar)

Upvotes: 1

Views: 2465

Answers (1)

divanov
divanov

Reputation: 6339

Oracle security provider supports only ECB mode instead of NONE. Algorithms are provided by security providers, registered to JVM and their names up to provider creators.

In situation, when you cannot know beforehand, which security providers installed in the execution environment, you may try different options. For example, like this:

Cipher cipher = null;
try {
    cipher = Cipher.getInstance("RSA/ECB/NoPadding");
} catch (NoSuchAlgorithmException e) {
    cipher = Cipher.getInstance("RSA/NONE/NoPadding");
}

Another possibility is to check installed providers on startup an make decision about algorithms

for (Provider provider : Security.getProviders()) {
    for (Provider.Service service : provider.getServices()) {
        System.out.println(provider.getName() + ": " + service.getType() + "." + service.getAlgorithm());
        // check these values and find a best match
    }
}

Upvotes: 3

Related Questions