Шифрование ключа AES с помощью открытого ключа RSAJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Шифрование ключа AES с помощью открытого ключа RSA

Сообщение Anonymous »

Я пишу небольшое приложение для передачи файлов, более или менее чтобы узнать больше об основах программного шифрования. Идея состоит в том, чтобы сгенерировать пару ключей 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: 
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")), но я не совсем уверен.

Подробнее здесь: https://stackoverflow.com/questions/965 ... public-key
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»