Несоответствие между представлением ключа publi c Java и RF C 8410 - PullRequest
3 голосов
/ 26 мая 2020

RF C 8410 перечисляет это как пример ключа Ed25519 publi c: MCowBQYDK2VwAyEAGb9ECWmEzf6FQbrBZ9w7lshQhqowtrbLDFw4rXAxZuE=

При декодировании с помощью декодера ASN.1 это становится:

30 2A
  30 05
    06 03 2B6570 // Algorithm Identifier
  03 21 0019BF44096984CDFE8541BAC167DC3B96C85086AA30B6B6CB0C5C38AD703166E1

Как и ожидалось, это соответствует определению SubjectPublicKeyInfo в RF C.

Используя поставщика криптографии Sun в Java 11+, я могу использовать этот код для генерации X25519 (не Ed25519 - это разница в идентификаторе алгоритма ниже) publi c key:

import java.security.KeyPairGenerator;
import java.util.Base64;

public class PrintPublicKey {
    public static void main(String args[]) throws Exception {
        KeyPairGenerator generator = KeyPairGenerator.getInstance("X25519");
        byte[] encodedPublicKey = generator.generateKeyPair().getPublic().getEncoded();
        System.out.println(Base64.getEncoder().encodeToString(encodedPublicKey));
    }
}

Что выведет что-то вроде: MCwwBwYDK2VuBQADIQDlXKI/cMoICnQRrV+4c//viHnXMoB190/z2MX/otJQQw==

Декодирование с помощью ASN .1, это становится:

30 2C
  30 07
    06 03 2B656E // Algorithm Identifier
    05 00        // Algorithm Parameters - NULL
  03 21 00E55CA23F70CA080A7411AD5FB873FFEF8879D7328075F74FF3D8C5FFA2D25043

Это имеет явный NULL после идентификатора объекта. Это действительно согласно спецификации? Он говорит:

В этом документе мы определяем четыре новых идентификатора OID для идентификации различных пар кривых / алгоритмов: кривые - это curve25519 и curve448, а алгоритмы - ECDH и EdDSA в чистом режиме.

Для всех OID параметры ДОЛЖНЫ отсутствовать.

1 Ответ

2 голосов
/ 26 мая 2020

В абзаце после того, что вы процитировали, говорится следующее:

Можно найти системы, требующие наличия параметров. Это может быть связано либо с дефектом исходного синтаксиса 1997 года, либо с ошибкой программирования, из-за которой разработчики так и не получили ввода, а это было неверно. Оптимальное решение - исправить эти системы; там, где это невозможно, проблема должна быть ограничена этой подсистемой, а не распространяться на Inte rnet.

Таким образом, правдоподобное объяснение поведения реализации Oracle состоит в том, что они хотят быть совместимым со старыми системами, требующими параметров. Это то, что вы делаете, чтобы не дать крупным клиентам с крупными контрактами на поддержку громко жаловаться, что «обновление до Java 11 сломало мою инфраструктуру».

...