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]