椭圆曲线Java

时间:2014-08-30 16:31:11

标签: java encryption elliptic-curve

我必须用Java编写一个程序来比较3种不同的非对称密码算法。我想选择密钥大小和消息大小(将随机生成),并且我想显示每个算法用相同维度的密钥加密相同文本所需的不同时间。

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

主要问题是:

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

1 个答案:

答案 0 :(得分:2)

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);
}