pyVision
A Machine Learning and Signal Processing toolbox

Download .zip Download.tar.gz View on GitHub


Java AES encryption and decryption

Introduction

In cryptography, encryption is the process of encoding a message or information in such a way that only authorized parties can access it

Encryption does not of itself prevent interference, but denies the intelligible content to a would-be interceptor

In an encryption scheme, the intended information or message, referred to as plaintext, is encrypted using an encryption algorithm, generating ciphertext that can only be read if decrypted.

For technical reasons, an encryption scheme usually uses a pseudo-random encryption key generated by an algorithm. It is in principle possible to decrypt the message without possessing the key, but, for a well-designed encryption scheme, considerable computational resources and skills are required.

An authorized recipient can easily decrypt the message with the key provided by the originator to recipients but not to unauthorized users.

Encryption Schemes

Efficient encryption schemes usually operate on fixed-size messages called blocks. Such schemes are called block ciphers.

Well-known examples:

  • DES (Data Encryption Standard).
  • 3DES (Triple DES)
  • AES (Advanced Encryption Standard)

AES

The Advanced Encryption Standard, or AES, is a symmetric block cipher.

It chosen by the U.S. government to protect classified information and is implemented in software and hardware throughout the world to encrypt sensitive data

In present day cryptography, AES is widely adopted and supported in both hardware and software.


import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

//Generate a key for encryption of specified length
    public static SecretKey getSecretEncryptionKey(int length) throws Exception{
        KeyGenerator generator = KeyGenerator.getInstance("AES");
        System.out.println(generator.getProvider().toString());
        generator.init(length); // The AES key size in number of bits
        SecretKey secKey = generator.generateKey();
        return secKey;
    }

Once the key is generated we can encrypt any plain text using the secret key

    public String encryptText(String plainText,SecretKey SEC_KEY,String initVector) throws Exception{

        Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
       IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
        aesCipher.init(Cipher.ENCRYPT_MODE, SEC_KEY,iv);
        byte[] byteCipherText = aesCipher.doFinal(plainText.getBytes());
        String encryptedData = Base64.getEncoder().encodeToString(byteCipherText);

        return encryptedData;
    }

Any entity with the access to the secret key would be able to decrypt the encoded text message

    public String decryptText(String encryptedData,SecretKey SEC_KEY,String initVector) throws Exception {

        byte[] byteCipherText = Base64.getDecoder().decode(encryptedData);
				IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
        Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        aesCipher.init(Cipher.DECRYPT_MODE, SEC_KEY,iv);
        byte[] bytePlainText = aesCipher.doFinal(byteCipherText);
        return new String(bytePlainText);
    }

The following functions allow us to encrypt a AES 128 bit key and encode and decode a string using CBC block cipher algorithm and use PKCS5Padding scheme

One of best-known, good block cipher modes is cipher block chaining (CBC).With it, every ciphertext block depends on all previous ciphertext blocks, which avoids repetition problems like we observed with ECB.

           String plaintext="12345asdasdadsadasd";					 
            String initVector = "RandomInitVector"; // 16 bytes IV
            SecretKey k=getSecretEncryptionKey(128);
            String e=encryptText(plaintext, k,initVector);
            String d=decryptText(e, k,initVector);
            System.out.println("AES encryption Testing -> text "+plaintext+"\n Encrypted String : "+e+"\n Descrypted String "+d);

References

  • http://www.cs.cornell.edu/courses/cs5430/2015sp/notes/crypto.php
blog comments powered by Disqus