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