Мои познания в криптографии слишком поверхностны, и у меня есть проблема, которую я не могу решить.
Кошельки Trezor имеют два формата подписи сообщений: «Trezor» и «Electrum».
В моем коде есть метод, который извлекает открытый ключ из сообщений, подписанных с использованием кошельков BTC (я использую биткойн
библиотека):
public VerificationStatus verifyMessage (String адрес кошелька, строковая фраза, строковая подпись) {
Адрес для подписиAddress = null;
Адрес addressFromKey = null;
пытаться {
signingAddress = Address.fromString(null, walletAddress);
ECKey ecKey = ECKey.signedMessageToKey(фраза, подпись);
addressFromKey = Address.fromKey(signingAddress.getParameters(), ecKey, signingAddress.getOutputScriptType());
} поймать (исключение SignatureException) {
LOGGER.error(exception.getMessage());
}
вернуть определение состояния проверки (адрес подписи, адрес из ключа);
}
Когда я подписываю сообщение с помощью кошелька Electrum или Trezor с выбранным форматом «Electrum», все работает нормально.
Пример данных для сообщения, подписанного Электрумом:
адрес: bc1qpluptcvxpvyzsmqzy8jrmdt3m985t6z95s24nu
сообщение: СООБЩЕНИЕ
подпись: H41bIfNhn1vT5yzgFUA3rZE7FNCM8epMrINVbzOefOImYs42hEIUHuoY/UkMd9ljjYkaci7fVJgCTUE6hPJN3Cg=
Но когда я пытаюсь использовать формат "Trezor", для которого подпись выглядит иначе:
адрес: bc1qpluptcvxpvyzsmqzy8jrmdt3m985t6z95s24nu
сообщение: СООБЩЕНИЕ
подпись: J41bIfNhn1vT5yzgFUA3rZE7FNCM8epMrINVbzOefOImYs42hEIUHuoY/UkMd9ljjYkaci7fVJgCTUE6hPJN3Cg=
я получаю Исключение Подписи
брошенный ECKey.signedMessageToKey(фраза, подпись);
, с сообщением об исключении:
Байт заголовка вне допустимого диапазона: 40
Как я упоминал в начале этого вопроса: моих знаний о криптографии почти нет, но я подозреваю, что Трезор подписывает сообщение, используя что-то другое, другой алгоритм, и это вызывает ECKey.signedMessageToKey()
метод выдает исключение, говорящее о том, что байт заголовка находится вне допустимого диапазона
Мой вопрос: как Trezor создает подпись, используя так называемый «формат Trezor», и как я могу решить эту проблему программно?