У меня есть алгоритм oid и байтовый массив со значением открытого ключа.Мне нужно закодировать его как asn1, определенный в стандарте X.509:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
Как я могу это сделать, кроме как вручную построить структуру asn1?
Например, у меня есть oid 1.2.643.7.1.1.1.1
, значение публичного балла 7800A33627EF627D19C0A8E1C284067031851A9860A92E0B405B0561643FF1B6056A31FD01AD1D5E74213175D2F3808509C759418FD08554C20C88B109072207
, и я хочу представить его как
SEQUENCE {
OBJECT IDENTIFIER '1 2 643 7 1 1 1 1'
BIT STRING, encapsulates {
OCTET STRING
78 00 A3 36 27 EF 62 7D 19 C0 A8 E1 C2 84 06 70
31 85 1A 98 60 A9 2E 0B 40 5B 05 61 64 3F F1 B6
05 6A 31 FD 01 AD 1D 5E 74 21 31 75 D2 F3 80 85
09 C7 59 41 8F D0 85 54 C2 0C 88 B1 09 07 22 07
}
}
upd: Благодаря ответу Вилкса!Итоговый код по ГОСТ 34.10-2012 с 256-битным ключом
byte[] publicPoint = Hex.decode("7800A33627EF627D19C0A8E1C284067031851A9860A92E0B405B0561643FF1B6056A31FD01AD1D5E74213175D2F3808509C759418FD08554C20C88B109072207");
GOST3410PublicKeyAlgParameters parameters = new GOST3410PublicKeyAlgParameters(
RosstandartObjectIdentifiers.id_tc26_gost_3410_12_256_paramSetA,
RosstandartObjectIdentifiers.id_tc26_gost_3411_12_256);
SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo(
new AlgorithmIdentifier(RosstandartObjectIdentifiers.id_tc26_gost_3410_12_256, parameters),
new DEROctetString(publicPoint));
byte[] encoded = spki.getEncoded();