2014-08-30 2 views
-4

Я должен сделать программу на Java, которая сравнивает 3 различных асимметричных алгоритма шифрования. Я хочу выбрать размер ключа и размер сообщения (который будет генерироваться случайным образом), и я хотел бы показать различное время, которое каждый алгоритм будет использовать для шифрования одного и того же текста с ключом с тем же размером.Эллиптическая кривая Java

Я хочу сравнить RSA, DSA и ECIES. Первые два не представляют никаких проблем, но для последнего я не знаю, что делать.

Основными проблемами являются:

  1. Какой эллиптическая кривая является безопасным для использования?
  2. Могу ли я использовать ту же кривую для разных размеров ключа?
  3. Как создать Cipher в Java, который использует "ECIES", кажется, что он не существует?

ответ

2

ECIES отсутствует в обычных библиотеках Java, по крайней мере, не до текущей даты. Вы должны использовать библиотеку, такую ​​как Bouncy Castle.

Для качества кривых вы можете взглянуть на http://safecurves.cr.yp.to (если у вас есть живот). Каждый набор параметров домена всегда напрямую привязан к размеру ключа. Мне нравятся сами Брейнпуль; они относительно стандартны и относительно безопасны, если вы используете их с некоторой осторожностью.

Примечание: никогда не следует напрямую шифровать открытый текст с помощью RSA, DSA или ECIES, всегда используйте гибридную криптографию. Поэтому сравните с входными размерами 128, 192 или 256 бит максимум.

Итак, без дальнейших церемоний.

public static void main(String[] args) throws Exception { 
    Security.addProvider(new BouncyCastleProvider()); 

    KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECIES"); 
    ECGenParameterSpec brainpoolP256R1 = new ECGenParameterSpec(
      "brainpoolP256R1"); 
    kpg.initialize(brainpoolP256R1); 
    KeyPair kp = kpg.generateKeyPair(); 

    Cipher c = Cipher.getInstance("ECIES"); 
    c.init(Cipher.ENCRYPT_MODE, kp.getPublic()); 

    final byte[] aesKeyData = new byte[16]; 
    SecureRandom rng = new SecureRandom(); 
    rng.nextBytes(aesKeyData); 

    byte[] wrappedKey = c.doFinal(aesKeyData); 
    SecretKey aesKey = new SecretKeySpec(aesKeyData, "AES"); 
    Arrays.fill(aesKeyData, (byte) 0); 
} 
+0

И обратите внимание, что у Гуавы хороший класс «StopWatch». –

+0

Я думаю, что ECIES уже является гибридной схемой шифрования, и он запустит криптографию AES для вас. Таким образом, примерный код выполняет некоторую дополнительную работу. –

+0

@ RomanPlášil Да, ECIES * по определению является гибридной криптосистемой. Он в основном устанавливает симметричный ключ, используя ECDH (и отбрасывает эфемерный закрытый ключ, используемый «отправителем»). Таким образом, результат асимметричной операции внутри ECIES - это просто секретный ключ, а не зашифрованный текст. –

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