Я пытался переключиться с 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, но приемлемо ли это решение?