Я работаю над приложением одноразового пароля, используя алгоритм hotp (RFC 4226). У меня есть Android-приложение (с помощью симулятора) для генерации OTP и серверное приложение для проверки. Сами по себе оба работают нормально и проходят тесты.
Однако секретный ключ, который я генерирую на своем устройстве, не совпадает с секретным ключом, который я генерирую на сервере, даже если входные данные жестко закодированы и совпадают между ними. Это приводит к тому, что на устройстве и на сервере генерируются разные одноразовые пароли, что лишает меня возможности генерировать действительные одноразовые пароли. Я пытаюсь понять, почему это происходит, и могу ли я что-то с этим сделать.
Код идентичен между сервером и имитатором устройства для создания SecretKeys и генерации одноразовых паролей из ключей. Я проверил байты в спецификациях ключей на устройстве и сервере, и они идентичны. Тем не менее, ключи, сгенерированные SecretKeyFactories (оба из DESedeKeySpecs), имеют небольшие различия, когда я просматриваю байты из secretKey.getEncoded (). Я вижу подобные различия, если я использую DES вместо тройного DES.
Что интересно, так это то, что в моем проекте Android байты в KeySpec и сгенерированном SecretKey согласованы (хотя и урезаны), но на сервере иногда возникают отдельные различия в байтах между KeySpec и сгенерированным Секретный ключ. Это нормально? Я читал кое-что об изменениях битов четности при использовании DES и тройного DES, поэтому я не уверен, что это проблема.
Я также знаю, что Android использует Bouncy Castle, но мой сервер использует SunJCE. Насколько я понимаю, это не должно вызывать проблем, и я хотел бы знать, является ли это известным случаем при использовании двух разных провайдеров. У меня очень ограниченные возможности получить серверную часть Bouncy Castle.
Советы и просвещение, пожалуйста?