ความรู้ด้านวิทยาการเข้ารหัสลับของฉันยังตื้นเขิน และฉันมีปัญหาที่แก้ไขไม่ได้
กระเป๋าเงิน Trezor มีรูปแบบการลงนามข้อความสองรูปแบบ: "Trezor" และ "Electrum"
ฉันมีวิธีการในรหัสของฉัน นั่นคือการดึงรหัสสาธารณะจากข้อความที่ลงนามโดยใช้กระเป๋าเงิน BTC (ฉันใช้ บิทคอยน์
ห้องสมุด):
VerificationStatus สาธารณะ VerificationMessage (String walletAddress, วลีสตริง, ลายเซ็นสตริง) {
การลงนามที่อยู่ = null;
ที่อยู่ addressFromKey = null;
พยายาม {
signAddress = Address.fromString (null, walletAddress);
ECKey ecKey = ECKey.signedMessageToKey (วลี ลายเซ็น);
addressFromKey = Address.fromKey (การลงนามAddress.getParameters (), ecKey, การลงนามAddress.getOutputScriptType ());
} catch (ข้อยกเว้นของ SignatureException) {
LOGGER.error(exception.getMessage());
}
กลับกำหนดVerificationStatus (การลงนามที่อยู่, addressFromKey);
}
เมื่อฉันเซ็นข้อความโดยใช้กระเป๋าเงิน Electrum หรือ Trezor โดยเลือกรูปแบบตัวเลือก "Electrum" ทุกอย่างทำงานได้ดี
ข้อมูลตัวอย่างสำหรับข้อความที่ลงนามโดย Electrum:
ที่อยู่: bc1qpluptcvxpvyzsmqzy8jrmdt3m985t6z95s24nu
ข้อความ: ข้อความ
ลายเซ็น: H41bIfNhn1vT5yzgFUA3rZE7FNCM8epMrINVbzOefOImYs42hEIUHuoY/UkMd9ljjYkaci7fVJgCTUE6hPJN3Cg=
แต่เมื่อฉันพยายามใช้รูปแบบ "Trezor" ซึ่งลายเซ็นดูแตกต่างออกไป:
ที่อยู่: bc1qpluptcvxpvyzsmqzy8jrmdt3m985t6z95s24nu
ข้อความ: ข้อความ
ลายเซ็น: J41bIfNhn1vT5yzgFUA3rZE7FNCM8epMrINVbzOefOImYs42hEIUHuoY/UkMd9ljjYkaci7fVJgCTUE6hPJN3Cg=
ฉันได้รับ ข้อยกเว้นลายเซ็น
โยนโดย ECKey.signedMessageToKey(วลี, ลายเซ็น);
โดยมีข้อความแสดงข้อยกเว้น:
ไบต์ส่วนหัวอยู่นอกช่วง: 40
ดังที่ฉันกล่าวไว้ในตอนต้นของคำถามนี้: ความรู้ของฉันเกี่ยวกับการเข้ารหัสแทบไม่มีอยู่จริง แต่จากสิ่งที่ฉันสงสัย - Trezor กำลังเซ็นข้อความโดยใช้สิ่งอื่น อัลกอริทึมอื่น และสิ่งนี้ทำให้ ECKey.signedMessageToKey()
เมธอดโยนข้อยกเว้นที่บอกว่าไบต์ของส่วนหัวอยู่นอกช่วง
คำถามของฉันคือ - Trezor สร้างลายเซ็นโดยใช้สิ่งที่เรียกว่า "รูปแบบ Trezor" ได้อย่างไร และฉันจะแก้ปัญหานี้โดยทางโปรแกรมได้อย่างไร