Шифрование ключа AES с открытым ключом RSA

Я пишу небольшое приложение для передачи файлов, более или менее как способ узнать больше о программных основах шифрования. Идея состоит в том, чтобы сгенерировать пару ключей RSA, обменяться открытыми ключами и отправить AES iv и ключ для дальнейшей расшифровки. Я хочу зашифровать ключ AES открытым ключом RSA получателя, например так:

// encode the SecretKeySpec
private byte[] EncryptSecretKey ()
{
    Cipher cipher = null;
    byte[] key = null;

    try
    {
        cipher = Cipher.getInstance("RSA/ECB/NOPADDING");
        // contact.getPublicKey returns a public key of type Key
        cipher.init(Cipher.ENCRYPT_MODE, contact.getPublicKey() );
        // skey is the SecretKey used to encrypt the AES data
        key = cipher.doFinal(skey.getEncoded());
    }
    catch(Exception e )
    {
        System.out.println ( "exception encoding key: " + e.getMessage() );
        e.printStackTrace();
    }
    return key;
}

Затем я записываю значение ключа в получатель и расшифровываю его так:

private SecretKey decryptAESKey(byte[] data )
{
    SecretKey key = null;
    PrivateKey privKey = null;
    Cipher cipher = null;

    System.out.println ( "Data as hex: " + utility.asHex(data) );
    System.out.println ( "data length: " + data.length );
    try
    {
        // assume this loads our private key
        privKey = (PrivateKey)utility.loadLocalKey("private.key", false);

        cipher = Cipher.getInstance("RSA/ECB/NOPADDING");
        cipher.init(Cipher.DECRYPT_MODE, privKey );
        key = new SecretKeySpec(cipher.doFinal(data), "AES");

        System.out.println ( "Key decrypted, length is " + key.getEncoded().length );
        System.out.println ( "data: " + utility.asHex(key.getEncoded()));
    }
    catch(Exception e)
    {
        System.out.println ( "exception decrypting the aes key: " + e.getMessage() );
        e.printStackTrace();
        return null;
    }

    return key;
}

В консоли, с другой стороны, я получаю это как вывод:

read_bytes for key: 16
data length: 16
Data as hex: <hex string>
Key decrypted, length is 256
java.security.InvalidKeyException: Invalid AES key length: 256 bytes

Кроме того, если я создаю байтовый массив размером 16 и помещаю в него вывод cipher.doFinal (data), размер массива, по-видимому, изменяется до 256 байтов (по крайней мере, .length). С чем это связано, и что я делаю неправильно?

редактировать
Я решил это, и думал, что опубликую проблему на случай, если кто-то столкнется с этим. Проблема, оказывается, была в RSA / ECB / NOPADDING. По какой-то странной причине это испортило мое создание SecretKey, когда я передал его клиенту. Этомог бы как-то связано с тем, как я генерирую пары ключей (для этого я использую getInstance ("RSA")), но я не совсем уверен.

Ответы на вопрос(3)

Ваш ответ на вопрос