椭圆曲线Java

问题描述:

我必须在Java中做一个比较3种不同非对称密码算法的程序。我想选择密钥大小和消息大小(随机生成),我想要显示不同的时间,每个算法将采用相同维度的密钥加密相同的文本。椭圆曲线Java

我想比较RSA,DSA和ECIES。前两个不会造成任何问题,但对于最后一个我不知道该怎么办。

的主要问题是:

  1. 哪个椭圆曲线是可以安全使用?
  2. 我可以对不同的密钥大小使用相同的曲线吗?
  3. 如何在Java中使用"ECIES"创建Cipher,它似乎不存在?

ECIES在正常的Java库中不存在,至少不会出现在当前日期。你必须使用像Bouncy Castle这样的图书馆。

对于曲线的质量,你可以看看http://safecurves.cr.yp.to(如果你有胃的话)。每组域参数总是直接与密钥大小相关联。我喜欢Brainpool曲线;如果你小心使用它们,它们是相对标准的和相对安全的。

注意:不要直接使用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'类。 – 2014-08-30 17:21:15

+0

我认为ECIES已经是一个混合加密方案,它会为你运行AES加密。示例代码因此做了一些额外的工作。 – 2016-05-12 09:30:23

+0

@RomanPlášil是的,ECIES *根据定义*是一个混合密码系统。它基本上使用ECDH建立一个对称密钥(并抛弃由“发件人”使用的短暂私钥)。所以ECIES中的非对称操作的结果就是秘密密钥,而不是密文。 – 2016-05-12 09:46:41