Java 椭圆曲线密码的20字节限制

Java 椭圆曲线密码的20字节限制,java,bouncycastle,elliptic-curve,Java,Bouncycastle,Elliptic Curve,我一直试图在代码中从RSA转换到ECC。起初,我尝试使用Bouncycastle,但在使用命名曲线时遇到了困难。我发现的示例代码都不起作用 所以我尝试了JECC,它工作得很好,除了一个问题。当使用“secp256r1”曲线时,我只能编码20个字节,160位,然后它会给我一个“索引超出范围”错误 这是JECC、椭圆曲线的限制,还是我自己的代码?我试着在线研究这个问题,但找不到任何关于256位ECC密钥可以编码多少数据的参考。使用RSA,我可以对任何小于所用密钥的数据进行编码 此外,ECC的数据填充

我一直试图在代码中从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.");
}
仅供参考:在几个循环之后,您可以看到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]);
}
hash=MessageDigest.getInstance(“SHA-1”); ... 字节[]摘要=hash.digest(); 对于(int j=0;j 看起来数据是根据散列进行异或运算的。如果我将“SHA-1”更改为“SHA-256”,我将不再得到错误


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

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


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

我想坚持使用JECC,而不是使用BouncyCastle,因为JECC更紧凑,只需要9类后,一点调整。但是,这个错误发生在我修改任何JECC代码之前。除非我错了,否则JECC实际上不会执行任何椭圆曲线加密,而是根据密钥的散列对数据进行异或。您可以在文件“ECCryptoSystem.java”中看到它在做什么
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]);
}