Изображение шифрования с ECC в Java - PullRequest
0 голосов
/ 21 мая 2019

Я хочу зашифровать изображение с помощью 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 в пикселе для создания нового изображения.

1 Ответ

1 голос
/ 21 мая 2019

Я правильно внедряю ECC?

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

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

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

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

...