Как победить квантовый компьютер с помощь WebAssembly?
XBSoftware
{
Тема: Как победить квантовый компьютер с помощь WebAssembly?,
Спикер: Владимир Дашукевич,
Компания: XBSoftware,
Конференция: HolyJS
}
Вопросы на сегодня:
- Насколько надежны современные криптографические алгоритмы, используемые в браузерах?
- Как эту ситуацию может изменить квантовый компьютер?
- Как мы можем повлиять на это?
Криптография обеспечивает:
- Конфиденциальность
- Целостность информации
- Аутентифика́ция
Алгоритм шифрования RSA
- Выбираем два простых числа: p = 5, q = 13
- Вычисляем модуль: n = p * q = 65
- Вычисляем функцию Эйлера: F(n) = (p - 1) * (q - 1) = 48
- Выбираем простое число е < F(n)
- Вычисляем d = e-1 mod F(n)
- {e, n} - публичный ключ, {d, n} - приватный ключ
Алгоритм взлома RSA шифра
- Вычисляем простые множители: 65 для получения F(n)
- Используем алгоритм решета числового поля
Выводы
- Алгоритмы асимметричного шифрования играют важнейшую роль в шифровании данных
- Единственный способ генерации общего симметричного ключа по протоколу TLS 1.2 - это RSA или DH
- Надежность RSA и DH основана на том, что существующие алгоритмы для классических компьютеров могут их взломать только за экспоненциальное время
Питер Шор
Алгоритм Шора
- Состоит из классической и квантовой части
- Сложность O(log3 M) (у классического компьютера O(2P(M)))
- Количество кубит O(log M)
- Проверен на 7 кубитном компьютере в 2001
- Его модификации способны также решать задачи дискретного логарифмирования
Бит и кубит
- 2 бита: 00, 01, 10, 11
- 2 кубита: a|00> + b|01> + c|10> + d|11>
Современный квантовый компьютер
- 5-кубитный компьютер от IBM доступен всем
- 20-кубитный компьютер доступен как сервис
- Построен 50-кубитный квантовый компьютер
- Но он все ещё нестабилен
- Он имеет узкую специфику
Постквантовая криптография
- Криптография, основанная на хэш-функциях
- Криптография, основанная на кодах исправления ошибок
- Криптография, основанная на решётках
- Криптография, основанная на многомерных квадратичных системах
А стоит ли нам готовиться?
Постквантовая криптография
Выводы:
- Существуют алгоритмы для квантового компьютера, способные за малое время узнать приватные ключи алгоритмов RSA, DSA и ECDHE
- Современные квантовые компьютеры не имеют достаточно мощностей для реального взлома RSA, DSA и ECDHE
- Весь современный мир постепенно начинает переходить на постквантовую криптографию
Схема обмена ключей:
- Генерация приватного и публичного ключей на клиенте (EphemeralKeyGeneration_A)
- Генерация приватного и публичного ключей на сервере (EphemeralKeyGeneration_B)
- Обмен публичными ключами
- Генерация разделяемого эфимерного ключа (EphemeralSecretAgreement_A, EphemeralSecretAgreement_B)
Что такое WebAssembly
- Это низкоуровневый байт-код, предназначенный для исполнения в браузере.
- Представлен в бинарном виде
- Имеет свою собственную виртуальную машину
- Имеет строгую статическую типизацию
- Не имеет сборщика мусора и доступа к нативным браузерным API
Как скомпилировать код для WebAssembly
- Скачать Emscripten
- Скачать SIDH
- Написать адаптер
- emcc -o sidh.js sidh.c -O3 -s WASM=1
- Получили fun.wasm
fetch("fun.wasm").then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, importObject)
).then(instance =>
instance.exports.exported_func();
)
fetch("fun.wasm").then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, importObject)
).then(instance =>
instance.exports.exported_func();
)
fetch("fun.wasm").then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, importObject)
).then(instance =>
instance.exports.exported_func();
)
fetch("fun.wasm").then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, importObject)
).then(instance =>
instance.exports.exported_func();
)
Проблемы компиляции в WebAssembly
- С - язык со строгой статической типизацией
- Сборщик мусора и управление памятью
- Указание публичных методов нашего модуля
let m = new WebAssembly.Memory({initial:10, maximum:100});
var i32 = new Uint32Array(instance.exports.mem.buffer);
for (var i = 0; i < 10; i++) {
i32[i] = i;
}
Проблемы компиляции в WebAssembly
- С - язык со строгой статической типизацией
- Сборщик мусора и управление памятью
- Указание публичных методов нашего модуля
let a = [];
let b = [1,2,3,4];
let c = [{}, true, 3, "hello"];
let d = { key1: 1, key2: c};
int main() {
int *ptr_one;
ptr_one = (int *)malloc(sizeof(int));
free(ptr_one);
return 0;
}
Проблемы компиляции в WebAssembly
- С - язык со строгой статической типизацией
- Сборщик мусора и управление памятью
- Указание публичных методов нашего модуля (main функция)
fetch("fun.wasm").then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, importObject)
).then(instance =>
instance.exports.exported_func();
)
var tbl = new WebAssembly.Table({
initial:2, element:"anyfunc"
});
console.log(tbl.length);
console.log(tbl.get(0)());
console.log(tbl.get(1)());
var tbl = new WebAssembly.Table({
initial:2, element:"anyfunc"
});
console.log(tbl.length);
console.log(tbl.get(0)());
console.log(tbl.get(1)());
var tbl = new WebAssembly.Table({
initial:2, element:"anyfunc"
});
console.log(tbl.length);
console.log(tbl.get(0)());
console.log(tbl.get(1)());
Экспорт функций из C
- Перечислить все в EXPORTED_FUNCTIONS параметре (cwrap, ccall, _secret)
- Использовать EMSCRIPTEN_KEEPALIVE дерективы (rust: #[no_mangle])
- Использовать конструкцию extern "C"
Проблемы компиляции в WebAssembly
- С - язык со строгой статической типизацией
- Сборщик мусора и управление памятью
- Указание публичных методов нашего модуля
Все шаги:
- Скачать Emscripten, SIDH, Python, CMake
- Написать простой адаптер на С
- Скомпилировать с максимальной оптимизацией
- Написать JS код для получения ключей
Запуск SIDH на сервере:
- Написать сервер на С
- Использовать WebAssembly npm пакет
- Внедрить как C Addon
- Использовать N-API (Stability: 1 - Experimental)
Адаптер для N-API
- Все работает в "отдельном" V8: napi_env
- Все значения napi_value
- Получение значений: napi_get_arraybuffer_info
- Возвращение значений: napi_create_arraybuffer
- Прокидывание функций: napi_create_function
- Скомпилировать: node-gyp
Выводы:
- WebAssembly очень сырой, мало инструментов, сложно дебажить, но если прижмет, то можно использовать
- Скомпилировать любой алгоритм на C/C++/Rust в WebAssemly не сложно
- Будущее WebAssembly выглядит заманчиво: сборщик мусора, многопоточность, LLVM, доступ к DOM и так далее.