Создайте открытый ключ в кодировке x509 из значения алгоритма oid и byte [] - PullRequest
1 голос
/ 24 сентября 2019

У меня есть алгоритм 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();

1 Ответ

1 голос
/ 24 сентября 2019

Все зависит от того, что идентифицирует OID, ИМХО.Я не совсем уверен в следующем.Мне пришлось искать OID вручную.

    byte[] data = Hex.decode("7800A33627EF627D19C0A8E1C284067031851A9860A92E0B405B0561643FF1B6056A31FD01AD1D5E74213175D2F3808509C759418FD08554C20C88B109072207");
    SubjectPublicKeyInfo spki = new SubjectPublicKeyInfo(
        new AlgorithmIdentifier(RosstandartObjectIdentifiers.id_tc26_gost_3410_12_256),
        new DEROctetString(data));
    ASN1Primitive asn1 = spki.toASN1Primitive();

Я пытался использовать org.bouncycastle.jcajce.provider.asymmetric.ecgost12.BCECGOST3410_2012PublicKey#BCECGOST3410_2012PublicKey(org.bouncycastle.asn1.x509.SubjectPublicKeyInfo), но по какой-то неизвестной мне причине, это не публичный, а только конструктор частного пакета.

...