Android AES(Key wrap)

I explained about AES in other entry. Android AES(Basic)

Next is wrap key and unwrap key.

Wrap key

public static byte[] wrapAES( Key key, Key wrap ) throws Exception
{
	Cipher cipher = Cipher.getInstance("AESWrap", "BC");
	cipher.init(Cipher.WRAP_MODE, wrap);		// AES wrap is AES key
	return cipher.wrap(key);		// wrapped
}

Use WRAP_MODE mode to wrap

Unwrap key

public static byte[] unwrapAES( byte[] wrappedkey, Key wrap ) throws Exception
{
	SecretKeySpec kekSpec = new SecretKeySpec(wrap.getEncoded(), "AES");
	Cipher cipher = Cipher.getInstance("AESWrap", "BC");
	cipher.init(Cipher.UNWRAP_MODE, kekSpec);
	SecretKey key = (SecretKey)cipher.unwrap(wrappedkey, "AES", Cipher.SECRET_KEY );
	return key.getEncoded();
}

Test in Activity

Let’s test above code in Activity


public class AESWrapKeyActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

try
{
Key aes = AESHelper.generateFromRandom(128);
Key target = AESHelper.generateFromRandom(128);

// Original
Log.d(“Original”, printBytes( target.getEncoded() ));

// Wrap key
byte[] wrappedkey = AESHelper.wrapAES(target, aes);

// Wrapped
Log.d(“Wrapped”, printBytes( wrappedkey ));

// UnWrap
byte[] unwrapped = AESHelper.unwrapAES(wrappedkey, aes);

// Unwrapped
Log.d(“Unwrapped”, printBytes( unwrapped ));
}
catch ( Exception oops )
{
oops.printStackTrace();
}
}

private String printBytes( byte[] bytes )
{
StringBuffer buffer = new StringBuffer();
for ( int i=0; i < bytes.length; i++ ) { buffer.append(String.format("%02x ", bytes[i])); } return buffer.toString(); } } [/java] wrap key