В вашем подходе с DSL (который дает весьма сомнительные плюшки, кстати) есть один большой минус: куча вызовов instanceof и созданий массивов даже в тех случаях, когда сообщение не будет выводиться в лог
Не рассматривайте камеру и софт отдельно друг от друга, относитесь к ним вместе как к продукту. Тогда возможно поставить вопрос, а не проще ли сменить продукт?
И еще важный, если не ключевой момент:
>> Функция F по идее может быть любой выдуманной функцией (хоть сложным хэшем, хоть тупо возвращающей 0)
Это не так, F обязательно должна зависеть от ключа k, т.е. в моем комментарии следует заменить F(L) на F(k, L).
Иначе всегда можно вычислить F(L) и раунд является бессмысленным.
Посмотрите на один раунд сети: вход (L, R) превращается в выход (L, R') = (L, F(L)^R)
А теперь обратно: вход (L, R') = (L, F(L)^R) превращается в выход (L, R'') = (L, F(L)^F(L)^R) = (L, R)
Осталось только добрать нужное количество раундов и менять местами L и R между раундами. Вот и вся магия :)
Ну и как фантазия на вашу тему, можно подумать над лоадером который будет получать список зависимостей из pom'а (или что вы там используете) и подгружать их.
На последний вопрос пока есть только такая идея: Снизить стоимость устройства или ОС на стоимость вычислений за достаточно длительный период. Т.е. грубо говоря смартфон стоит на 10 баксов дешевле, подразумевая что в нем запущен неотключаемый агент выполняющий по заказу вендора определенные вычисления.
Насчет массивов можно решить по другому:
— Это — ядро, а вокруг него вращаются электроны… (Рисует)
— Можно вопрос? А вот что между ядром и электроном?
— Как что, воздух!
>> Функция F по идее может быть любой выдуманной функцией (хоть сложным хэшем, хоть тупо возвращающей 0)
Это не так, F обязательно должна зависеть от ключа k, т.е. в моем комментарии следует заменить F(L) на F(k, L).
Иначе всегда можно вычислить F(L) и раунд является бессмысленным.
А теперь обратно: вход (L, R') = (L, F(L)^R) превращается в выход (L, R'') = (L, F(L)^F(L)^R) = (L, R)
Осталось только добрать нужное количество раундов и менять местами L и R между раундами. Вот и вся магия :)