Using the KeyGenerator class and showing how to create a SecretKeySpec from an encoded key





import java.security.Key;

import java.security.Security;



import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;



/**

 * Basic example using the KeyGenerator class and showing how to create a

 * SecretKeySpec from an encoded key.

 */

public class MainClass {

  public static void main(String[] argsthrows Exception {

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

    byte[] input = "www.java2s.com".getBytes();

    

    byte[] ivBytes = new byte[] { 0×000×000×000×010×040×050×060×070×000×000×00,

        0×000×000×000×000×01 };



    Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding""BC");

    KeyGenerator generator = KeyGenerator.getInstance("AES""BC");



    generator.init(192);



    Key encryptionKey = generator.generateKey();



    System.out.println("key   : " + Utils.toHex(encryptionKey.getEncoded()));

    System.out.println("input : " new String(input));



    // encryption pass

    cipher.init(Cipher.ENCRYPT_MODE, encryptionKey, new IvParameterSpec(ivBytes));

    byte[] cipherText = new byte[cipher.getOutputSize(input.length)];

    int ctLength = cipher.update(input, 0, input.length, cipherText, 0);

    ctLength += cipher.doFinal(cipherText, ctLength);



    // decryption pass

    Key decryptionKey = new SecretKeySpec(encryptionKey.getEncoded(), encryptionKey.getAlgorithm());

    cipher.init(Cipher.DECRYPT_MODE, decryptionKey, new IvParameterSpec(ivBytes));

    byte[] plainText = new byte[cipher.getOutputSize(ctLength)];

    int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);

    ptLength += cipher.doFinal(plainText, ptLength);

    System.out.println("plain : " new String(plainText" bytes: " + ptLength);

  }

}





class Utils

{

    private static String digits = "0123456789abcdef";

    

    /**

     * Return length many bytes of the passed in byte array as a hex string.

     

     @param data the bytes to be converted.

     @param length the number of bytes in the data block to be converted.

     @return a hex representation of length bytes of data.

     */

    public static String toHex(byte[] data, int length)

    {

        StringBuffer  buf = new StringBuffer();

        

        for (int i = 0; i != length; i++)

        {

            int v = data[i0xff;

            

            buf.append(digits.charAt(v >> 4));

            buf.append(digits.charAt(v & 0xf));

        }

        

        return buf.toString();

    }

    

    /**

     * Return the passed in byte array as a hex string.

     

     @param data the bytes to be converted.

     @return a hex representation of data.

     */

    public static String toHex(byte[] data)

    {

        return toHex(data, data.length);

    }

}



           

       

Leave a Reply