2012-04-16 8 views
2

Я пытаюсь детерминистически генерировать пару ключей RSA с помощью Java на Android. Мои требования таковы, что я не могу сохранить пару ключей, и она должна быть сгенерирована во время выполнения, чтобы быть эквивалентной предыдущим/будущим прогонам.Детерминированная генерация пар ключей шифрования RSA

Мой процесс был в том, что я детерминистически семена генератора случайных чисел и передаю этот генератор для создания ключей. Мой код:

SecureRandom random=SecureRandom.getInstance("SHA1PRNG"); 
random.setSeed(1234); //something device specific will be used to set this 
KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA"); 
keyGen.initialize(1024, random); 

KeyPair pair=keyGen.generateKeyPair(); 
PublicKey pub=pair.getPublic(); 
PrivateKey priv=pair.getPrivate(); 

Результирующие ключи отличаются от пробега для запуска. Тем не менее, номера SecureRandom одинаковы от запуска до запуска и даже одинакового для всех устройств.

Что мне не хватает? Как я могу повторять эти ключи?

Thanks

+0

Почему вы хотите это сделать? Разумеется, если вы не хотите хранить пару ключей RSA, то вы также не захотите хранить случайное семя, используемое для создания пары RSA? Странно, что этот код не делает то, что вы хотите, но для меня кажется, что вы можете это сделать, не подумав об этом через –

ответ

8

Что вы пытаетесь сделать? Даже если это будет работать, этот код будет опираться на причуду реализации SHA1PRNG на Android, поэтому он может сломаться в любое время. Как правило, setSeed() добавляет энтропию, поэтому вы не можете гарантировать, что вы получите одинаковые номера, даже если вы высеваете SecureRandom с тем же семенем. Если вы попробуете этот код на настольной Java, скорее всего, он не сработает. Пока это работает на большинстве (всех?) Текущих версий Android, но это не гарантируется.

Если вам нужны предсказуемые ключи, вам может потребоваться предоставить каждому устройству предварительно сгенерированные ключи. Если вам необходимо безопасно их хранить, используйте API KeyChain на ICS или защищенное паролем ключевое слово на устройствах до ICS. Даже если вы не храните фактический ключ, если кто-то знает, как сгенерированы ключи (семя), они могут генерировать одни и те же ключи, а ваши ключи только настолько безопасны, как семя. Если это устройство специфично, скорее всего, его не так сложно найти.

Что касается причин, по которым это не работает, генератор ключей RSA в основном генерирует случайный BigIntegers в цикле, тестируя простые числа. Первичный тест вероятен, поэтому вы можете получить разные простые числа, выбранные в каждом прогоне. Возможно, вы захотите получить SpongyCastle, запустите его на эмуляторе и установите контрольные точки в RSAKeyPairGenerator.java, чтобы проверить, что именно происходит.

+0

Спасибо за подробное объяснение того, как работает генератор ключей и реализация SpongyCastle. Все это является частью (ошибочной) попытки минимизировать пиратство контента из покупок в приложении. Я надеялся, что я могу зашифровать содержимое на сервере и доставить его клиенту без обмена ключами и дешифровать контент «на лету». Мне нужно создать пару ключей на сервере, передать закрытый ключ клиенту, а затем использовать KeyStore, как вы предложили, с некоторым алгоритмически сгенерированным паролем, чтобы немного увеличить его. – Aaron

+0

Я вижу (вид). Вы пытаетесь реализовать DRM. RSA может быть не лучшим для этого. Если вы передаете ключ клиенту, вам, естественно, нужно убедиться, что это происходит надежно, и это может быть непросто. Идея состоит в том, чтобы поместить определенный бит устройства (IMEI и т. Д.) В IAB DeveloperPayload и получить его, когда вы проверяете подпись на своем сервере. Затем используйте это для создания симметричного ключа (AES), связанного с этим конкретным устройством, зашифрованного содержимого и отправки его на устройство. Затем устройство генерирует один и тот же симметричный ключ и расшифровывает содержимое. –

+0

Конечно, вы можете захотеть хэш IMEI и т. Д., Чтобы вы не собирали фактическую идентификационную информацию устройства. –

Смежные вопросы