Java 椭圆曲线密码的20字节限制
我一直试图在代码中从RSA转换到ECC。起初,我尝试使用Bouncycastle,但在使用命名曲线时遇到了困难。我发现的示例代码都不起作用 所以我尝试了JECC,它工作得很好,除了一个问题。当使用“secp256r1”曲线时,我只能编码20个字节,160位,然后它会给我一个“索引超出范围”错误 这是JECC、椭圆曲线的限制,还是我自己的代码?我试着在线研究这个问题,但找不到任何关于256位ECC密钥可以编码多少数据的参考。使用RSA,我可以对任何小于所用密钥的数据进行编码 此外,ECC的数据填充有多重要?我找不到任何关于ECC标准填充实践的信息 提前感谢您的帮助 编辑: 这是我的代码,以防你想知道。我稍微修改了原始的JACC代码,因此没有任何类型转换Java 椭圆曲线密码的20字节限制,java,bouncycastle,elliptic-curve,Java,Bouncycastle,Elliptic Curve,我一直试图在代码中从RSA转换到ECC。起初,我尝试使用Bouncycastle,但在使用命名曲线时遇到了困难。我发现的示例代码都不起作用 所以我尝试了JECC,它工作得很好,除了一个问题。当使用“secp256r1”曲线时,我只能编码20个字节,160位,然后它会给我一个“索引超出范围”错误 这是JECC、椭圆曲线的限制,还是我自己的代码?我试着在线研究这个问题,但找不到任何关于256位ECC密钥可以编码多少数据的参考。使用RSA,我可以对任何小于所用密钥的数据进行编码 此外,ECC的数据填充
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现在我不是一个密码学家,我不想改变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]);
}