Создать PrivateKey из байтового массива - PullRequest
7 голосов
/ 05 января 2011

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

Спасибо, Вук

Ответы [ 5 ]

6 голосов
/ 16 июня 2011

Я тоже искал этот ответ и наконец нашел его.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.

5 голосов
/ 05 января 2011

Как указано в Java документах

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

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

3 голосов
/ 05 января 2011

Выбросить кодированный массив байтов.На 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 Forum на форумах Oracle,Если вы ищете там RSAPrivateKey, вы найдете несколько интересных сообщений.

0 голосов
/ 30 мая 2019
//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);
0 голосов
/ 10 мая 2012

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

...