Предел 20 байт с криптографией на эллиптических кривых

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


person Mick    schedule 18.10.2013    source источник
comment
Я бы предпочел использовать JECC, а не BouncyCastle, поскольку JECC более компактен и требует только 9 классов после небольшой настройки. Однако эта ошибка произошла до того, как я изменил какой-либо код JECC.   -  person Mick    schedule 20.10.2013
comment
Если я не ошибаюсь, JECC фактически НЕ выполняет какую-либо криптографию на основе эллиптических кривых, а скорее выполняет XOR данных против хэша ключа. Вы можете увидеть, что он делает, в файле ECCryptoSystem.java.   -  person Mick    schedule 20.10.2013


Ответы (1)


Причина, по которой JECC шифрует только 20 байтов открытого текста, заключается в том, что во время процесса шифрования он пытается выполнить XOR для ввода со значением дайджеста. Длина дайджеста SHA-1, используемого JECC, составляет 160 бит (20 байтов).

Кроме того, JECC не шифрует данные с помощью ECC, скорее это прототип ECIES, который включает создание симметричного ключа с использованием обмена ключами ECC Diffie Hellman, а не с использованием любого настраиваемого алгоритма симметричного шифрования.

person Omar    schedule 13.01.2015