椭圆曲线Java
问题描述:
我必须在Java中做一个比较3种不同非对称密码算法的程序。我想选择密钥大小和消息大小(随机生成),我想要显示不同的时间,每个算法将采用相同维度的密钥加密相同的文本。椭圆曲线Java
我想比较RSA,DSA和ECIES。前两个不会造成任何问题,但对于最后一个我不知道该怎么办。
的主要问题是:
- 哪个椭圆曲线是可以安全使用?
- 我可以对不同的密钥大小使用相同的曲线吗?
- 如何在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);
}
并注意番石榴有一个很好的'StopWatch'类。 – 2014-08-30 17:21:15
我认为ECIES已经是一个混合加密方案,它会为你运行AES加密。示例代码因此做了一些额外的工作。 – 2016-05-12 09:30:23
@RomanPlášil是的,ECIES *根据定义*是一个混合密码系统。它基本上使用ECDH建立一个对称密钥(并抛弃由“发件人”使用的短暂私钥)。所以ECIES中的非对称操作的结果就是秘密密钥,而不是密文。 – 2016-05-12 09:46:41