security

PBE with a PBEParameterSpec example

With this example we are going to demonstrate how to make PBE using a PBEParameterSpec. In short, to make a Password-Based Encryption using a PBEParameterSpec you should:

  • Create three byte arrays, the first one from the String message to be encrypted, the second one to be used as a key and the third one to be used as an initialization vector.
  • Create a new Cipher for the specific transformation, using an org.bouncycastle.jce.provider.BouncyCastleProvider(), with the getInstance(String transformation, String provider) API method.
  • Initialize the cipher in encryption mode, using a SecretKeySpec and a IvParameterSpec created by the specific key and initialization vector, using the init(int opmode, Key key, AlgorithmParameterSpec params) API method of the Cipher.
  • Encrypt the input String.
  • Create a character array of a String that will be the password, a byte array to be used as a salt and an iteration count.
  • Create a new PBEKeySpec from the password.
  • Create a SecretKeyFactory, using the getInstance(String algorithm, String provider) API method, for the PBEWithSHAAnd3KeyTripleDES algorithm and the BC Provider.
  • Create a new Key Object, with the PBEKeySpec, using the generate(KeySpec keySpec) API method of the SecretKeyFactory.
  • Create a new cipher for the PBEWithSHAAnd3KeyTripleDES algorithm, using a BC Provider.
  • Initialize the cipher in decryption mode, using the new secret key and a new PBEParameterSpec instance with the salt and the iteration counter.
  • Decrypt the above encrypted byte array.

Let’s take a look at the code snippet that follows:

package com.javacodegeeks.snippets.core;

import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class Main {

    public static void main(String[] args) throws Exception {

  Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

  

  byte[] inpStr = "www.javacodegeeks.com".getBytes();

  

  byte[] pkey = new byte[]{0x73, 0x2f, 0x2d, 0x33, (byte) 0xc8, 0x01, 0x73, 0x2b, 0x72,


0x06, 0x75, 0x6c, (byte) 0xbd, 0x44, (byte) 0xf9, (byte) 0xc1, (byte) 0xc1, 0x03,


(byte) 0xdd, (byte) 0xd9, 0x7c, 0x7c, (byte) 0xbe, (byte) 0x8e};

  

  byte[] iVector = new byte[]{(byte) 0xb0, 0x7b, (byte) 0xf5, 0x22, (byte) 0xc8, (byte) 0xd6,


0x08, (byte) 0xb8};


  // encryption with precalculated keys


  Cipher cEnc = Cipher.getInstance("DESede/CBC/PKCS7Padding", "BC");


  cEnc.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(pkey, "DESede"), new IvParameterSpec(


    iVector));


  byte[] out = cEnc.doFinal(inpStr);


  // decryption with PBE


  char[] passphrase = "password".toCharArray();

  byte[] saltBytes = new byte[]{0x7d, 0x60, 0x43, 0x5f, 0x02, (byte) 0xe9, (byte) 0xe0, (byte) 0xae};

  int cnt = 2048;

  PBEKeySpec pbe = new PBEKeySpec(passphrase);

  SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithSHAAnd3KeyTripleDES", "BC");


  Cipher cipherDec = Cipher.getInstance("PBEWithSHAAnd3KeyTripleDES", "BC");

  Key skey = keyFactory.generateSecret(pbe);


  cipherDec.init(Cipher.DECRYPT_MODE, skey, new PBEParameterSpec(saltBytes, cnt));


  System.out.println("encrypted : " + new String(out).getBytes("UTF-8").toString());

  System.out.println("generated key: " + new String(skey.getEncoded()));

  System.out.println("initialization vector : " + new String(cipherDec.getIV()).getBytes("UTF-8").toString());

  System.out.println("decrypted  : " + new String(cipherDec.doFinal(out)));
    }
}

Output:

encrypted : [B@c2380d1
generated key: 

 
This was an example of how to make a password-based Encryption using a PBEParameterSpec in Java.

Byron Kiourtzoglou

Byron is a master software engineer working in the IT and Telecom domains. He is an applications developer in a wide variety of applications/services. He is currently acting as the team leader and technical architect for a proprietary service creation and integration platform for both the IT and Telecom industries in addition to a in-house big data real-time analytics solution. He is always fascinated by SOA, middleware services and mobile development. Byron is co-founder and Executive Editor at Java Code Geeks.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button