Рейтинг:2

Генерация и проверка подписи с расширенным закрытым ключом ED25519

флаг jp

Я создаю зашифрованное приложение для обмена сообщениями по сети Tor, и в настоящее время я изо всех сил пытаюсь использовать сгенерированный Tor закрытый ключ ed25519 для подписи и проверки любого сообщения.

Приведенный ниже фрагмент кода работает с 32-байтовым ключом, однако после пропуска 32 байтов заголовка hs_ed25519_secret_key он не может проверить подпись в следующих случаях:

1 - секретный: левая половина из оставшихся 64 байт, общедоступный: правая половина
2 - секретный: левая половина оставшихся 64 байт, общедоступный: последние 32 байта hs_ed25519_public_key после удаления заголовка
3 - секретный: все 64 байта, общедоступный: последние 32 байта hs_ed25519_public_key

Я нашел библиотеку Python, которая, кажется, делает это PyNaCl однако я не слишком хорошо знаком с py.

Что-то я делаю неправильно или bouncycastle не поддерживает расширенные 64-байтовые закрытые ключи?

импортировать org.bouncycastle.crypto.Signer;
импортировать org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters;
импортировать org.bouncycastle.crypto.params.Ed25519PublicKeyParameters;
импортировать org.bouncycastle.crypto.signers.Ed25519Signer;
импортировать java.nio.charset.StandardCharsets;
открытый класс ED25519 {
    public static void main(String[] args) выдает Exception {
        byte[] message = "сообщение для подписи".getBytes(StandardCharsets.UTF_8);
        Подписавший подписывающий = новый Ed25519Signer();
        signer.init(true, new Ed25519PrivateKeyParameters(KeysUtil.myPrivKey, 0));
        signer.update(сообщение, 0, message.length);
        Подписавший верификатор = новый Ed25519Signer();
        verifier.init(false, new Ed25519PublicKeyParameters(KeysUtil.myPubKey, 0));
        verifier.update(сообщение, 0, длина сообщения);
        логическое значение validSig = verifier.verifySignature(signer.generateSignature());
    }
}

```
Рейтинг:1
флаг es

Ваш код в порядке, если вы попросите BouncyCastle сгенерировать пару ключей:

var gen = новый Ed25519KeyPairGenerator();
gen.init (новые параметры Ed25519KeyGenerationParameters (новый SecureRandom()));
var keyPair = gen.generateKeyPair();
var sk = новый байт[32];
((Ed25519PrivateKeyParameters) keyPair.getPrivate()).encode(sk, 0);
var pk = ((Ed25519PublicKeyParameters) keyPair.getPublic()).getEncoded();

Причина, по которой он не работает для вашей пары ключей Tor, заключается в том, что BouncyCastle не вычисляет открытый ключ путем скалярного умножения базовой точки на ваш секретный ключ с прямым порядком байтов.

Вместо этого следует RFC 8032 и выполняя SHA-512 для исходного материала ключа, очищая и устанавливая определенные биты, а затем используя его в качестве секретного ключа для определения открытого ключа.

Он делает это:

MessageDigest md = MessageDigest.getInstance("SHA-512");
байт [] дайджест = md.digest (initialKeyMaterial);
var sk = подмассив (дайджест, 0, 32);
ск[0] &= 248;
ск[31] &= 127;
ск[31] |= 64;
var pk = basePoint.scalarMultiply(sk);

Если секретный ключ, который вы указываете, уже прошел это преобразование SHA-512, то ваш код дает сбой, потому что теперь он выполняет SHA-512 дважды. Поскольку вы не можете отменить операцию SHA-512, то, если вы должны использовать BouncyCastle, вам нужно будет сгенерировать свой секретный ключ в BouncyCastle, а затем использовать его с tor, а не наоборот.

Однако, поскольку вам, вероятно, нужно начать с пары ключей Tor, вы можете рассмотреть возможность изменения кода BouncyCastle, чтобы он не выполнял преобразование SHA-512 до его использования в качестве ключа подписи.

Miliano avatar
флаг jp
Хм, спасибо за совет, я попытаюсь переработать процесс подписи, так как я не могу использовать сгенерированные BC пары ключей, когда позже мне нужно будет использовать быстрый тщеславный адрес с mkp224o, который генерирует 64-байтовый расширенный ключ, такой как tor.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.