Как обернуть ключ RSA в режиме AESWRAP - PullRequest
1 голос
/ 05 апреля 2019

Я предполагаю обернуть свой закрытый ключ 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 Ответ

2 голосов
/ 05 апреля 2019

RFC-5649 (Обработка ключа расширенного стандарта шифрования (AES) с алгоритмом заполнения) была опубликована для обработки случаев, для которых материал ключа не кратен 64 битам.

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

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

...