我一直在尝试在代码中从RSA切换到ECC。起初,我尝试使用Bouncycastle,但是我很难让命名曲线工作。我发现的示例代码都没有工作。
所以我尝试了JECC并且工作得很好,除了一个问题。使用“secp256r1”曲线时,我只能编码20个字节,160位,然后才能给出“索引超出范围”错误。
这是JECC,Elliptic Curves一般的限制,还是我自己的代码?我尝试在线研究这个问题,但是找不到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的核心功能,但这是一个有效的解决方案吗?
答案 0 :(得分:0)
JECC仅加密20字节明文的原因是在加密过程中它试图用输入值对输入进行异或。 JECC使用的SHA-1的摘要长度为160位(20字节)。
JECC也没有使用ECC加密数据,而是ECIES的原型,它涉及使用ECC Diffie Hellman密钥交换生成对称密钥,而不是使用任何自定义对称加密算法。