【问题标题】:20 Byte limit with Elliptic Curve Cryptography椭圆曲线密码学的 20 字节限制
【发布时间】:2013-10-18 18:27:29
【问题描述】:

我一直在尝试在我的代码中从 RSA 切换到 ECC。起初,我尝试使用 Bouncycastle,但我很难让命名曲线工作。我找到的示例代码都没有工作。

所以我尝试了 JECC,它工作得很好,除了一个问题。使用“secp256r1”曲线时,我只能编码 20 个字节,160 位,然后它给我一个“索引超出范围”错误。

这是对 JECC、一般椭圆曲线还是我自己的代码的限制?我尝试在线研究这个问题,但找不到任何关于 256 位 ECC 密钥可以编码多少数据的参考资料。使用 RSA,我可以对任何小于所用密钥的数据进行编码。

此外,使用 ECC 填充数据有多重要?我找不到任何有关 ECC 标准填充实践的信息。

提前感谢您的帮助。

编辑: 如果您想知道,这是我的代码。我稍微修改了原始的 JACC 代码,所以没有任何类型转换。

ECCryptoSystem cs = new ECCryptoSystem(new EllipticCurve(new secp256r1()));

t1=System.currentTimeMillis();
ECKey sk = cs.generateKey(); // secure key
ECKey pk = sk.getPublic(); // public key
t2=System.currentTimeMillis();
System.out.println("Generated keys in "+(t2-t1)+"ms.");

for(int c=0;c<10;c++){
    t1=System.currentTimeMillis();
    byte[] s1=args[0].getBytes();
    byte[] s2=cs.encrypt(s1,args[0].length(),pk);
    byte[] s3=cs.decrypt(s2,sk);
    t2=System.currentTimeMillis();

    if(Arrays.equals(s1,s2)){System.out.println("Bad encryption!");}
    if(!Arrays.equals(s1,s3)){System.out.println("Bad decryption!");}

    String decoded = new String(s3, "UTF-8");
    System.out.println("loop "+(c+1)+": \""+decoded+"\" ("+decoded.length()+" Characters) in "+(t2-t1)+"ms.");
}

我是这样运行它的:

$ java Mecc "This is a good test."
Generated keys in 397ms.
loop 1: "This is a good test." (20 Characters) in 208ms.
loop 2: "This is a good test." (20 Characters) in 107ms.
loop 3: "This is a good test." (20 Characters) in 69ms.
loop 4: "This is a good test." (20 Characters) in 68ms.
loop 5: "This is a good test." (20 Characters) in 73ms.
loop 6: "This is a good test." (20 Characters) in 59ms.
loop 7: "This is a good test." (20 Characters) in 64ms.
loop 8: "This is a good test." (20 Characters) in 58ms.
loop 9: "This is a good test." (20 Characters) in 60ms.
loop 10: "This is a good test." (20 Characters) in 60ms.
$ java Mecc "This is a good test.."
Generated keys in 555ms.
Error: java.lang.ArrayIndexOutOfBoundsException: 20

仅供参考:您可以看到 JIT 编译器在几个循环后如何加快速度。

另一个编辑: 我刚刚浏览了 JECC 代码,发现了一些有趣的东西:

hash = MessageDigest.getInstance("SHA-1");
...
byte[] digest = hash.digest();
for(int j = 0; j < numbytes; j++) {
    res[j+ek.mother.getPCS()]=(byte) (input[j]^digest[j]);
}

似乎数据与哈希值进行了异或运算。如果我将“SHA-1”更改为“SHA-256”,我将不再收到错误消息。

现在我不是密码学家,我宁愿不更改 JECC 的核心功能,但这是一个有效的解决方案吗?

【问题讨论】:

  • 我想坚持使用 JECC,而不是使用 BouncyCastle,因为 JECC 更紧凑,稍微调整后只需要 9 个类。然而,这个错误发生在我修改任何 JECC 代码之前。
  • 除非我错了,否则 JECC 实际上不会执行任何椭圆曲线加密,而是将数据与密钥的哈希值进行异或。你可以在文件“ECCryptoSystem.java”中看到它在做什么

标签: java bouncycastle elliptic-curve


【解决方案1】:

JECC 只加密 20 字节的明文的原因是在加密过程中,它试图将输入与摘要值进行异或。 JECC 使用的 SHA-1 的摘要长度为 160 位(20 字节)。

JECC 也不使用 ECC 加密数据,而是 ECIES 的原型,其中涉及使用 ECC Diffie Hellman 密钥交换生成对称密钥,而不是使用任何自定义对称加密算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-07
    • 2015-05-09
    • 1970-01-01
    • 2015-07-05
    • 2011-12-06
    • 2022-10-25
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多