Последовательность сообщений с нулевым разглашением
У меня есть несколько серверов (для резервирования), отправляющих данные клиентам. Клиенты должны обрабатывать эти сообщения последовательно и игнорировать дубликаты.
Мы используем внешнюю информацию для определения специальной строки последовательности, которая является детерминированной для всех наших серверов, поскольку синхронизация серверов будет слишком медленной.
Сгенерированные строки последовательности содержат остатки сверхсекретной информации, и мы не можем раскрыть их клиентам.
Предположим, что строка последовательности просто содержит целое число. Есть ли способ хешировать эти данные, чтобы клиенты могли заказывать сообщения, не узнавая никакой дополнительной информации о их содержании?
Предположим, что используется более сложная строка последовательности. Строка разбивается на подпоследовательности, и каждой подпоследовательности присваивается категория, например «a:12477/t:637» и «a:12477/e:456», где функция сравнения последовательностей приведена ниже. . Можно ли хэшировать строку последовательности таким образом, чтобы даже такая сложная функция могла работать с данными и ни с чем другим?
Псевдокод JavaScript:
function compare(seq_a: string, seq_b: string) {
function decode(seq) {
seq_a.split("/").map(segment => {
let [category, sub_seq] = segment.split(":");
return { category, sub_seq: Number(sub_seq) }
});
}
let a = decode(seq_a);
let b = decode(seq_b);
for (let i = 0; i < Math.max(a.length, b.length); i++) {
let segment_a = a[i] || { category: "empty", sub_seq: 0 };
let segment_b = b[i] || { category: "empty", sub_seq: 0 };
if (segment_a.category != segment_b.category) {
return "UNKNOWN";
}
if (segment_a.sub_seq > segment_b.sub_seq) {
return "A";
} else if (segment_a.sub_seq < segment_b.sub_seq) {
return "B";
} else if (segment_a.sub_seq == segment_b.sub_seq) {
continue;
}
}
return "UNKNOWN";
}
У меня очень мало знаний в области криптографии и нулевого знания, поэтому я еще ничего не пробовал, поэтому самое большее, что я получил, — это просто осознание идеи того, что нужно.
1 ответ
Я думаю, что использовать для этого что-то вроде нулевого знания было бы огромным излишним. Я бы, по крайней мере, начал с размышлений о всяких других вещах.
Вот несколько идей, некоторые из них, вероятно, неосуществимы, в зависимости от вашего конкретного варианта использования:
Добавьте в строки немного соли, которая скроет секретные данные. Например, если мы говорим, что исходные данные имеют целые числа 3, 7 и 15: сгенерируйте случайную соль (скажем, 5), добавьте ее ко всем числам и затем отправьте дальше. Менять соль можно регулярно, соблюдая некоторые правила.
Сгенерируйте информацию для заказа без секретных данных. Поэтому не делитесь секретными данными, а делитесь только сгенерированной информацией о заказе. При необходимости ваша внутренняя база данных может сопоставлять данные заказа и секретные данные.
В любом случае, я думаю, что с помощью ЗК этого добиться будет довольно сложно. Возможно, какое-то гомоморфное шифрование, но оно, опять же, намного сложнее и все еще находится в стадии тщательного исследования.