образ шифрования с ECC в java

Я хочу зашифровать изображение с помощью ECC, я попытался использовать Bouncy Castle, но он не может зашифровать каждый пиксель отдельно, и я спросил об этом в другом вопросе здесь, в stackoverflow, и ответ заключался в том, чтобы реализовать ECC без B ** C. Итак, я поискал информацию о ECC и нашел:

Криптография на основе эллиптических кривых состоит из трех различных операций:

1_ генерация ключа:

  • нам нужен point G, также называемый точкой генератора.
  • большое целое число nB сохраняется как закрытый ключ.
  • и точка PB = nB * G объявлена ​​общедоступной. - сопоставить текстовое сообщение с точкой на эллиптической кривой (для этого я получаю каждый пиксель и умножаю его на G).

2_ шифрование:

  • отправитель выбирает random positive integer k.

  • затем использует открытый ключ PB для генерации точки шифрования Cm, состоящей из двух точек. Cm = [{k G}, {Pm +(k PB)}].

3_ расшифровка:

C2 – nB * C1 = {Pm + (k * PB)}{nB * (k * G)}
                = Pm + k*(nB * G)nB * (k * G)
                = Pm

Проблема в том, что при отображении пикселя и его шифровании результат представляет собой точку, как получить из него значение зашифрованного пикселя, чтобы я мог создать новое изображение? я на правильном пути внедрения ECC ??

   public static void main(String[] args) {
        try{

           X9ECParameters x9 = NISTNamedCurves.getByName("P-224"); 
           org.bouncycastle.math.ec.ECPoint g = x9.getG();
           BigInteger n = x9.getN();
           int nBitLength = n.bitLength();

           BigInteger privatekey;
           do{
                Random rand = new Random();
                privatekey = new BigInteger(nBitLength,rand);
           }
           while (privatekey.equals(ZERO)  || (privatekey.compareTo(n) >= 0));
                org.bouncycastle.math.ec.ECPoint publickey = g.multiply(privatekey); 

             BigInteger k;
             Random randk = new Random();
             k= new BigInteger(nBitLength,randk); 
            File bmpFile = new File("C:\\Users\\acer\\Desktop\\py\\6.bmp");
            BufferedImage image = ImageIO.read(bmpFile);
            int width           = image.getWidth();
            int height          = image.getHeight();

            BigInteger [][] pixels = new BigInteger [width][height];

            for( int i = 0; i < width; i++ )
                for( int j = 0; j < height; j++ )
                     pixels[i][j] = BigInteger.valueOf(image.getRGB( i, j ));

            org.bouncycastle.math.ec.ECPoint mappedpixel,encryptedpixel;

            for( int i = 0; i < width; i++ ){
                for( int j = 0; j < height; j++ ){
                    mappedpixel= g.multiply(pixels[i][j]);
                    encryptedpixel=mappedpixel.add(publickey.multiply(k));   

                }
            }     
        }
        catch (IOException e){
             System.out.println(e.getMessage());
        } 

        }

проблема в последнем «for»: он отображает пиксель и шифрует его, но не знает, как поместить значение encryptedpixel в пиксель для создания нового изображения.


person Chada    schedule 20.05.2019    source источник
comment
См. IESCipher.   -  person President James K. Polk    schedule 21.05.2019


Ответы (1)


Я правильно использую ECC?

Абсолютно нет, и вы даже не идете правильным путем, чтобы понять ECC.

У ECC нет такой операции шифрования, как у RSA. Существует шифрование Эль-Гамаля, но поскольку ECC работает с полями такого небольшого размера, ни одна хорошая схема шифрования с ним не совместима. Кроме того, он расширит сообщение, например, От 10 до 64 байтов - и это только после очень либерального подхода к правильному заполнению сообщения - то, что требуется для безопасной работы. Таким образом, ваше изображение вырастет в 6,4 раза, если вы будете использовать прямое шифрование ECC.

Как упоминал Джеймс, есть нечто, называемое ECIES, которое в основном получает симметричный ключ с помощью DH, отправляя локальный открытый ключ с сообщением, а затем уничтожая временный закрытый ключ. Затем получатель может получить тот же симметричный ключ, используя свой закрытый ключ и открытый ключ. Затем этот производный ключ для конкретного сообщения можно использовать для шифрования / дешифрования сообщения (то есть данных пикселей), например, с использованием AES-CTR, который не имеет никаких накладных расходов (кроме IV, но поскольку у вас есть случайный ключ данных, вы может использовать статический IV / одноразовый идентификатор, например, все нули).

К сожалению, это все равно оставит вам открытый ключ, который будет храниться рядом с сообщением.

person Maarten Bodewes    schedule 21.05.2019
comment
Я пробовал ecies с B ** C, но он шифрует все изображение как файл, а не пиксели. И я спросил об этом здесь stackoverflow.com/questions/56089485/ - person Chada; 21.05.2019
comment
Ну да, где хранить необходимые накладные расходы - это вопрос. Однако ECIES по-прежнему является единственным способом выполнить эту задачу. Попытки зашифровать с использованием любого асимметричного алгоритма без расширения зашифрованного текста - бесполезное занятие: на практике асимметричное шифрование невозможно без расширения зашифрованного текста. То, что вы шифруете весь файл, а не пиксели, конечно же, ошибка вашей реализации, а не проблема самой идеи. - person Maarten Bodewes; 21.05.2019
comment
Так нет возможности зашифровать изображение с помощью ecc ?? - person Chada; 21.05.2019
comment
Не путем неявного сопоставления каждого пикселя нет, если вы не хотите расширить свой зашифрованный текст и, следовательно, размер его возраста примерно в 32-64 раза. Я не знаю, что вам сказать, кроме информации в ответе. - person Maarten Bodewes; 22.05.2019