Создать PrivateKey из байтового массива

java cryptography javacard

15158 просмотра

5 ответа

123 Репутация автора

Есть ли способ генерировать PrivateKey из байтового массива? Я получил этот байтовый массив с помощью метода getEncoded (), но теперь мне нужно преобразовать его обратно в PrivateKey.

Спасибо Вук

Автор: Vuk Источник Размещён: 05.01.2011 01:31

Ответы (5)


5 плюса

14510 Репутация автора

Как указано в документации по Java

Ключи обычно получают с помощью генераторов ключей, сертификатов или различных классов идентификации, используемых для управления ключами. Ключи также могут быть получены из ключевых спецификаций (прозрачных представлений основного ключевого материала) посредством использования фабрики ключей.

Класс KeyFactory может помочь вам с этим.

Автор: Patrick Размещён: 05.01.2011 01:45

3 плюса

25574 Репутация автора

Выбросьте закодированный байтовый массив. На JavaCard нет AFAIR, который не может декодировать его напрямую - вы должны установить различные ключевые компоненты отдельно.

Например, RSAPrivateKey должен быть инициализирован с показателем степени и модулем:

rsaPrivate = (RSAPrivateKey) javacard.security.KeyBuilder.buildKey
  (javacard.security.KeyBuilder.TYPE_RSA_PRIVATE, 
  javacard.security.KeyBuilder.LENGTH_RSA_512, false);

byte[] exponent = {(byte) 7};
byte[] modulus = {(byte) 33};
rsaPrivate.setExponent(exponent, (short) 0, (short) exponent.length);
rsaPrivate.setModulus(modulus, (short) 0, (short) modulus.length);

Кстати: для вопросов JavaCard я рекомендую форум JavaCard на форумах Oracle. Если вы ищете там RSAPrivateKey, вы найдете несколько интересных сообщений.

Автор: Robert Размещён: 05.01.2011 01:31

6 плюса

1736 Репутация автора

Я тоже искал этот ответ и наконец нашел его. keyBytes - это байтовый массив, изначально созданный с помощью getEncoded ().

//add BouncyCastle as a provider if you want
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
//create a keyfactory - use whichever algorithm and provider
KeyFactory kf = KeyFactory.getInstance("DSA", "BC");
//for private keys use PKCS8EncodedKeySpec; for public keys use X509EncodedKeySpec
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(keyBytes);
PrivateKey pk = kf.generatePrivate(ks);

Я никогда ничего не делал для JavaCard, но из этого поста похоже, что вы можете использовать класс KeyFactory. Вам, вероятно, нужно скачать библиотеку BouncyCastle.

Автор: marchica Размещён: 16.06.2011 07:30

0 плюса

64865 Репутация автора

Либо вам нужно самостоятельно декодировать кодированный BLOB-объект PKCS # 8 (разбор ASN.1 BER) и установить компоненты, либо вы можете получить компоненты из закрытого ключа (по крайней мере, частного экспоненты и модуля) как Java BigIntegers, преобразовать их в байтовые массивы без знака и установите их в API Java Card, как объяснил Роберт. Разбор PKCS # 8 может быть выполнен на Java Card, но это довольно ужасное упражнение.

Автор: Maarten Bodewes Размещён: 10.05.2012 07:35

0 плюса

1 Репутация автора

//ECDSA algo of signature type prime256 of key
Security.addProvider(new BouncyCastleProvider());
KeyFactory factory = KeyFactory.getInstance("ECDSA", "BC");
ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(new BigInteger(1, privKey), spec);
PrivateKey privateKey = factory.generatePrivate(ecPrivateKeySpec);
Автор: Amal Kallel Размещён: 29.05.2019 09:32
Вопросы из категории :
32x32