Все подписи / проверить библиотеки хорошо работают вместе для любого сообщения по 253 символов - но когда они должны хранить длину сообщения в более чем один байт, то получить действительно волосатые. Я пытался фиксируя вещи сам, но я даже не уверен, что использовать в качестве ссылки больше. Если кто-то может мне точку в правильном направлении, или просто скажите мне, какой бит исходного кода для использования в качестве эталона, я был бы очень благодарен.
Вот как проверка PHP скрипт сиг (из https://github.com/scintill/php-bitcoin-signature-routines) Ожидает, что длина сообщения должны быть закодированы:
Код:
Функция numToVarIntString ($ я) {
если ($ я < 0xfd) {
вернуться Chr ($ я);
} Еще если ($ я <= 0xffff) {
вернуть пакет ( 'Cv', 0xfd, $ я);
} Еще если ($ я <= 0xffffffff) {
вернуть пакет ( 'CV', 0xfe, $ я);
} Еще {
певд InvalidArgumentException ( 'INT слишком большой');
}
}
если ($ я < 0xfd) {
вернуться Chr ($ я);
} Еще если ($ я <= 0xffff) {
вернуть пакет ( 'Cv', 0xfd, $ я);
} Еще если ($ я <= 0xffffffff) {
вернуть пакет ( 'CV', 0xfe, $ я);
} Еще {
певд InvalidArgumentException ( 'INT слишком большой');
}
}
Этот код согласуется только с помощью метода brainwallet.org в, опять же, если длина сообщения меньше 253.
Вот как библиотека подписания JS (от https://github.com/bitcoinjs/bitcoinjs-lib) Кодирует длину до подписания:
Код:
numToVarInt: функция (я)
{
Если я < 0xfd) {
// символ без знака
вернуться [I];
} Еще если (я <= 1<<16) {
// беззнаковое короткое (LE)
вернуться [0xfd, я >>> 8, я & 255];
} Еще если (я <= 1<<32) {
// неподписанных Int (LE)
вернуться [0xfe] .concat (Crypto.util.wordsToBytes ([I]));
} Еще {
// без знака долго долго (LE)
вернуться [0xFF] .concat (Crypto.util.wordsToBytes ([я >>> 32, я]));
}
}
{
Если я < 0xfd) {
// символ без знака
вернуться [I];
} Еще если (я <= 1<<16) {
// беззнаковое короткое (LE)
вернуться [0xfd, я >>> 8, я & 255];
} Еще если (я <= 1<<32) {
// неподписанных Int (LE)
вернуться [0xfe] .concat (Crypto.util.wordsToBytes ([I]));
} Еще {
// без знака долго долго (LE)
вернуться [0xFF] .concat (Crypto.util.wordsToBytes ([я >>> 32, я]));
}
}
Я уже знаю об одной ошибки в коде JS: я<<32 оценивает значение 0. Я не слишком беспокоиться о том, что на данный момент, хотя, потому что я все еще пытаюсь получить, что второй случай на работу.
Библиотека питона подписи (от https://github.com/vbuterin/pybitcointools) Просто использует CHR (Len (сообщение)), которое, очевидно, работает только тогда, когда LEN (сообщение) < 253.
Я предполагаю, что реализация brainwallet.org является правильным, но прежде, чем я пытаюсь переделать все другие инструменты, в соответствии с тем, как ведет себя этот инструмент, я полагал, что я пришел к вам, ребята, и убедиться, что я на правильном пути.
Я был бы более чем счастлив, чтобы исправить какой из них нарушается, если бы я только знал наверняка, какой из них был прав, или если бы я указал на реализацию, что был прав. Я просто имея много неприятностей начать, так как я новичок как криптография и разработки ПО с открытым исходным кодом (он берет меня некоторое время, чтобы копаться в чужом коде и найти то, что я ищу).
С другой стороны, если есть лучше испытанные библиотеки там для этих языков (или других!) Для подписания / проверки Bitcoin сообщений, я хотел бы услышать о них.
Заранее спасибо за любую помощь, вы можете предложить!