Cunoștințele mele de criptografie sunt dincolo de superficiale și am o problemă pe care nu o pot rezolva.
Portofelele Trezor au două formate de semnare a mesajelor: „Trezor” și „Electrum”.
Am o metodă în codul meu, care este preluarea cheii publice din mesajele semnate folosind portofelele BTC (folosesc bitcoinj
bibliotecă):
public VerificationStatus verifyMessage(String walletAddress, String phrase, String semnătură) {
Semnarea adreseiAdresa = null;
Adresă addressFromKey = null;
încerca {
signingAddress = Address.fromString(null, walletAddress);
ECKey ecKey = ECKey.signedMessageToKey(frază, semnătură);
addressFromKey = Address.fromKey(signingAddress.getParameters(), ecKey, signingAddress.getOutputScriptType());
} captură (excepție SignatureException) {
LOGGER.error(exception.getMessage());
}
return determineVerificationStatus(signingAddress, addressFromKey);
}
Când semnez un mesaj folosind portofelul Electrum sau Trezor cu opțiunea formatul „Electrum” selectată, totul funcționează bine.
Exemple de date pentru mesajul semnat Electrum:
adresa: bc1qpluptcvxpvyzsmqzy8jrmdt3m985t6z95s24nu
mesaj: MESAJ
semnătură: H41bIfNhn1vT5yzgFUA3rZE7FNCM8epMrINVbzOefOImYs42hEIUHuoY/UkMd9ljjYkaci7fVJgCTUE6hPJN3Cg=
Dar când încerc să folosesc formatul „Trezor”, pentru care semnătura arată diferit:
adresa: bc1qpluptcvxpvyzsmqzy8jrmdt3m985t6z95s24nu
mesaj: MESAJ
semnătură: J41bIfNhn1vT5yzgFUA3rZE7FNCM8epMrINVbzOefOImYs42hEIUHuoY/UkMd9ljjYkaci7fVJgCTUE6hPJN3Cg=
Primesc un SignatureException
aruncat de ECKey.signedMessageToKey(frază, semnătură);
, cu un mesaj de excepție:
Octet antet în afara intervalului: 40
După cum am menționat la începutul acestei întrebări: cunoștințele mele despre criptografie sunt aproape inexistente, dar din ceea ce bănuiesc - Trezor semnează mesajul folosind altceva, un alt algoritm, iar acest lucru provoacă ECKey.signedMessageToKey()
metoda aruncă o excepție care spune că octetul antetului este în afara intervalului
Întrebarea mea este: cum creează Trezor semnătura folosind așa-numitul „format Trezor” și cum aș putea rezolva această problemă în mod programatic?