Thursday, February 26, 2015

Encrypting and Decrypting Images Using BlowFish

Blowfish is a symmetric-key block cipher, designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products.
For more information, refer to http://en.wikipedia.org/wiki/Blowfish_(cipher)

To Encrypt and Desrypt Images , follow following steps

Encrypting and Decrypting Images Using BlowFish :
1. Create SecretKey which will be used for Encryption
SecretKey secretKey = new SecretKeySpec(password.getBytes(), "Blowfish");

2. Create Cipher Instance
Cipher cipher = Cipher.getInstance("Blowfish");

3. To Encrypt, Initialize Cipher using secretKey
cipher.init(Cipher.ENCRYPT_MODE, secretKey);


 then read input Image and create new encrypted file using cipher.update and cipher.doFinal as shown below

4. To Decrypt, Initialzie Cipher  sugin previously used secretKey
cipher.init(Cipher.DECRYPT_MODE, secretKey);


 then read input encrypted Image and create new decrypted file using cipher.update and cipher.doFinal as shown below

Encrypting and Decrypting Images using Java and BlowFish Cipher

package com.anuj.algorithms;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
 * 
 * @author ANPATEL
 *
 */
public class EncryptDecryptImages {

 KeyGenerator keyGenerator = null;
 SecretKey secretKey = null;
 Cipher cipher = null;
 String password = "Anuj";
 String password1 = "Anuj1";

 public EncryptDecryptImages() {
  try {
   //keyGenerator = KeyGenerator.getInstance("Blowfish");
   //secretKey = keyGenerator.generateKey();
   secretKey = new SecretKeySpec(password.getBytes(), "Blowfish");
   cipher = Cipher.getInstance("Blowfish");

  } catch (NoSuchPaddingException e) {
   e.printStackTrace();
  } catch (NoSuchAlgorithmException e) {
   e.printStackTrace();
  }
 }

 /**
  * 
  * @param srcFile
  * @param destFile
  */
 private void encrypt(String srcFile, String destFile) {
  File fileTobeCrypted = new File(srcFile);
  File encryptedFile = new File(destFile);
  InputStream inputStream = null;
  OutputStream outputStream = null;
  try {
   System.out.println("Encryption started..");
   
   cipher.init(Cipher.ENCRYPT_MODE, secretKey);
   inputStream = new FileInputStream(fileTobeCrypted);
   outputStream = new FileOutputStream(encryptedFile);

   byte[] buffer = new byte[1024];
   int i;
   while ((i = inputStream.read(buffer)) > 0) {
    //use update if we have to encrypt/decrypt multiple blocks
    outputStream.write(cipher.update(buffer, 0, i));
    outputStream.flush();
   }
   
   //If we use doFinal repeatedly, the encryption will work without errors. 
   //But decryption will fail throwing exception - javax.crypto.BadPaddingException
   outputStream.write(cipher.doFinal());
   inputStream.close();
   outputStream.close();
   
   System.out.println("Encryption Completed..");

  } catch (IllegalBlockSizeException e) {
   e.printStackTrace();
  } catch (BadPaddingException e) {
   e.printStackTrace();
  } catch (InvalidKeyException e) {
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }

 /**
  * 
  * @param srcFile
  * @param destFile
  */
 private void decrypt(String srcFile, String destFile) {
  File encryptedFile = new File(srcFile);
  File decryptedFile = new File(destFile);
  InputStream inputStream = null;
  OutputStream outputStream = null;
  try {
   System.out.println("Decryption started...");
   
   //Descryption will fail due to we are decrypting using different key
   //secretKey = new SecretKeySpec(password1.getBytes(), "Blowfish");
   
   cipher.init(Cipher.DECRYPT_MODE, secretKey);
   inputStream = new FileInputStream(encryptedFile);
   outputStream = new FileOutputStream(decryptedFile);

   byte[] buffer = new byte[1024];
   int i;
   while ((i = inputStream.read(buffer)) > 0) {
    outputStream.write(cipher.update(buffer, 0, i));
    outputStream.flush();
   }
   outputStream.write(cipher.doFinal());
   inputStream.close();
   outputStream.close();
   System.out.println("Decryption completed...");
   
  } catch (IllegalBlockSizeException e) {
   e.printStackTrace();
  } catch (BadPaddingException e) {
   e.printStackTrace();
  } catch (InvalidKeyException e) {
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }
 
 public static void main(String[] args) {
  String fileTobeEncrypted = "netbeans.jpeg";
  String encryptedFile = "encryptedFile.jpeg";
  String decryptedFile = "decryptedFile.jpeg";
  EncryptDecryptImages encryptFile = new EncryptDecryptImages();

  encryptFile.encrypt(fileTobeEncrypted, encryptedFile);
  encryptFile.decrypt(encryptedFile, decryptedFile);
 }
}


Output












Reference Links
  • http://en.wikipedia.org/wiki/Blowfish_(cipher)
  • http://en.wikipedia.org/wiki/Triple_DES
  • http://en.wikipedia.org/wiki/Cipher
  • http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
  • http://en.wikipedia.org/wiki/Twofish
  • http://en.wikipedia.org/wiki/Data_Encryption_Standard