Вам на самом деле нужно несколько разных частей крипто.
Во-первых, вы хотите, чтобы клиент зашифровал файл для загрузки, а после извлечения зашифрованной полезной нагрузки расшифровал его.
Во-вторых,Вы хотите, чтобы какой-либо метод передавал зашифрованный файл для загрузки таким образом, чтобы гарантировать, что только правильный пользователь может получить доступ к его файлам.
Первая проблема требует алгоритма симметричного шифрования.Есть куча, но ваш лучший выбор, вероятно, AES.Если вы посмотрите на gwt-crypto , то у них есть оболочка для реализации java надувного замка.Это заботится о двух из трех ваших платформ.Я не работаю с платформой Android, но я был бы удивлен, если бы не было реализации AES.Что касается ключа, вы, вероятно, получите хеш пароля.Просто помните о возможности радужных столов и принимайте соответствующие меры.Пароль, используемый для шифрования файла, никогда не должен передаваться по проводам, так как я понимаю вашу модель, все шифрование и обман выполняется на клиенте.Поскольку вы упомянули системных администраторов в качестве потенциального злоумышленника, вам действительно нужно взглянуть на регистраторы ключей, дампы памяти и тому подобное, но это выходит за рамки конкретного вопроса, который вы задали.
Вторая проблема - это решенная проблемаиспользование TLS с клиентскими и серверными сертификатами.Клиенты для таких доступны для всех трех платформ, которые вы просматриваете.Тем не менее, хотите ли вы, чтобы ваши пользователи прошли через установку клиентских сертификатов, решать только вам.Существуют различные альтернативные варианты, но ни один из них не является проверенным.