Kiến thức về mật mã của tôi còn rất nông cạn và tôi có một vấn đề không thể giải quyết được.
Ví Trezor có hai định dạng ký tin nhắn: "Trezor" và "Electrum".
Tôi có một phương thức trong mã của mình, đó là truy xuất khóa chung từ các tin nhắn được ký bằng ví BTC (tôi đang sử dụng bitcoinj
thư viện):
public VerificationStatus verifyMessage(Chuỗi địa chỉ ví, Cụm từ chuỗi, Chữ ký chuỗi) {
Ký địa chỉAddress = null;
Địa chỉ addressFromKey = null;
cố gắng {
signAddress = Address.fromString(null, walletAddress);
ECKey ecKey = ECKey.signedMessageToKey(cụm từ, chữ ký);
addressFromKey = Address.fromKey(signingAddress.getParameters(), ecKey, signAddress.getOutputScriptType());
} bắt (ngoại lệ SignatureException) {
LOGGER.error(ngoại lệ.getMessage());
}
trả lại xác địnhVerificationStatus(signingAddress, addressFromKey);
}
Khi tôi ký một tin nhắn bằng ví Electrum hoặc Trezor với tùy chọn định dạng "Electrum" được chọn, mọi thứ đều hoạt động tốt.
Dữ liệu ví dụ cho tin nhắn đã ký Electrum:
địa chỉ: bc1qpluptcvxpvyzsmqzy8jrmdt3m985t6z95s24nu
tin nhắn: TIN NHẮN
chữ ký: H41bIfNhn1vT5yzgFUA3rZE7FNCM8epMrINVbzOefOImYs42hEIUHuoY/UkMd9ljjYkaci7fVJgCTUE6hPJN3Cg=
Nhưng khi tôi cố gắng sử dụng định dạng "Trezor", chữ ký có vẻ khác:
địa chỉ: bc1qpluptcvxpvyzsmqzy8jrmdt3m985t6z95s24nu
tin nhắn: TIN NHẮN
chữ ký: J41bIfNhn1vT5yzgFUA3rZE7FNCM8epMrINVbzOefOImYs42hEIUHuoY/UkMd9ljjYkaci7fVJgCTUE6hPJN3Cg=
tôi nhận được một Chữ kýNgoại lệ
ném bởi ECKey.signedMessageToKey(cụm từ, chữ ký);
, với một thông báo ngoại lệ:
Byte tiêu đề nằm ngoài phạm vi: 40
Như tôi đã đề cập ở phần đầu của câu hỏi này: kiến thức của tôi về mật mã hầu như không tồn tại, nhưng theo những gì tôi nghi ngờ - Trezor đang ký tin nhắn bằng một thứ khác, một thuật toán khác và điều này gây ra ECKey.signedMessageToKey()
phương thức đưa ra một ngoại lệ cho biết byte tiêu đề nằm ngoài phạm vi
Câu hỏi của tôi là - Trezor tạo chữ ký bằng cách sử dụng cái gọi là "Định dạng Trezor" như thế nào và làm cách nào tôi có thể giải quyết vấn đề này theo chương trình?