【问题标题】:Elliptic Curve Java椭圆曲线 Java
【发布时间】:2014-08-30 16:31:10
【问题描述】:

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

我想比较 RSA、DSA 和 ECIES。前两个没有问题,但最后一个我不知道该怎么办。

主要问题是:

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

【问题讨论】:

    标签: java encryption elliptic-curve


    【解决方案1】:

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

    【讨论】:

    • 请注意,Guava 有一个不错的 StopWatch 类。
    • 我认为 ECIES 已经是一种混合加密方案,它将为您运行 AES 加密。因此,示例代码做了一些额外的工作。
    • @RomanPlášil 是的,ECIES 根据定义是一种混合密码系统。它基本上使用 ECDH 建立了一个对称密钥(并丢弃了“发送者”使用的临时私钥)。因此,ECIES 中的非对称操作的结果只是那个密钥,而不是密文。
    • .... 并且使用在 Java 中设置为“ECIES”的Cipher 的结果将是使用 AES(默认情况下)使用您所说的生成的密钥加密的密文。所以你不需要自己编写这部分代码。
    • 当然是 Bouncy Castle 提供程序而不是“Java”决定了 AES 加密是默认值,否则是的,这是正确的。
    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多