Как обернуть ключ RSA в режиме AESWRAP

#java #encryption #aes #rsa #private-key

#java #шифрование #aes #rsa #закрытый ключ

Вопрос:

Я предполагаю обернуть мой закрытый ключ RSA в режим AESWrap (следуя RFC 3394). Однако я получаю исключение, в котором говорится, что «длина ключа, который нужно обернуть, должна быть кратна 8 байтам». Я считаю, что это в основном потому, что RSA PrivateKey находится в формате DER, и, следовательно, генерируется исключение. Пожалуйста, предложите, как это решить.

 
    SecretKey swkKeySpec = new SecretKeySpec(KEK, 0, swkKey.length, "AES");///KEK is a 256 bit AES key used for wrapping.
    cipher = Cipher.getInstance("AESWrap", "SunJCE");
    cipher.init(Cipher.WRAP_MODE, swkKeySpec);

    byte[] key = keyAttributes.getPrivateKey() ///This returns private key in encoded format which is to be wrapped.
    KeyFactory factory = KeyFactory.getInstance("RSA"); // throws NoSuchAlgorithmException
    PrivateKey privateKey  = factory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
    log.debug("key.length: {}", key.length); ///this gives 634.
    wrappedAppKey = cipher.wrap(privateKey); ///exception thrown at this point`
  

Комментарии:

1. Вам нужно будет реализовать схему заполнения / распаковки, чтобы сделать ввод для ключа кратным 8 байтам. Вы можете использовать очень распространенную схему заполнения PKCS7 из RFC2315, раздел 10.2, примечание № 2 .

Ответ №1:

Для обработки случаев, для которых материал ключа не кратен 64 битам, был опубликованRFC-5649 (Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm).

BouncyCastle, бесплатная библиотека Java, реализующая множество криптографических алгоритмов, предлагает механизм переноса, который поддерживает алгоритм переноса ключей RFC-5649. Таким образом, вы можете использовать эту библиотеку, чтобы избежать исключения Java, с которым вы сталкиваетесь.

Обратите внимание, что то, что мы обычно называем ключом RSA из 2048 бит, например, не просто состоит из массива из 256 байт. Он состоит из двух простых чисел, так что их произведение может быть сохранено в массиве из 256 байт, он также состоит из частного показателя, который ниже, чем вышеупомянутое произведение. В зависимости от способа хранения материала закрытого ключа в файле, в файл могут быть инкапсулированы некоторые другие общедоступные данные, такие как общедоступный показатель. Таким образом, материал закрытого ключа ключа RSA из 2048 бит может не храниться в 256 байтах.