Результат шифрования ECB может быть другим. это так же, как результат CBC

public class Symmetric1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception{
        // TODO code application logic here
        KeyGenerator kg = KeyGenerator.getInstance("DES");
    kg.init(new SecureRandom());
    SecretKey secretKey = kg.generateKey();

    FileInputStream inFile = new FileInputStream("C:/Users/Administrator/Desktop/original.bmp");

    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);

    FileOutputStream outFile = new FileOutputStream("C:/Users/Administrator/Desktop/ECB_original.bmp");

    byte[] input = new byte[64];
    int bytesRead;
    while((bytesRead = inFile.read(input)) != -1){
        byte[] output = cipher.update(input,0,bytesRead);
        if(output != null)
            outFile.write(output);
    }

    byte[] output = cipher.doFinal();
    if(output != null)
        outFile.write(output);

    inFile.close();
    outFile.flush();
    outFile.close();
    }
}

я узнал, что шифрование ecb делает картинку немного туманной... но мой код делает оригинальную картинку довольно зашифрованной, как CBC Encryption. в чем дело?

Вот код шифрования CBC тоже.

public class Symmetric2 {

    public static void main(String[] args) throws Exception{
        // TODO Auto-generated method stub

        FileInputStream inFile = new FileInputStream("C:/Users/Administrator/Desktop/original.bmp");
        FileOutputStream outFile = new FileOutputStream("C:/Users/Administrator/Desktop/CBC_original.bmp");

        KeyGenerator kg = KeyGenerator.getInstance("DES");
        kg.init(new SecureRandom());

        SecretKey sk = kg.generateKey();

        Cipher cp = Cipher.getInstance("DES/CBC/PKCS5Padding");

        byte[] ivBytes = new byte[]{
                0x00, 0x01,0x02, 0x03, 0x00, 0x00, 0x00, 0x01       };
        IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);

        cp.init(Cipher.ENCRYPT_MODE, sk, ivSpec); //CBC방식이므로 인자가 3개이다.

        byte[] input = new byte[64]; //getBytes() 
        int bytesRead;
        while((bytesRead = inFile.read(input)) != -1){
            byte[] output = cp.update(input,0,bytesRead);
            if(output != null)
                outFile.write(output);
        }
        byte[] output = cp.doFinal();
        if(output != null)
            outFile.write(output);

        inFile.close();
        outFile.flush();
        outFile.close();
    }

}

1 ответ

Широко известная пингвина картина выглядит грязной. Он только шифрует само растровое изображение, в то время как файл BMP также содержит метаданные. Кроме того, он опирается на правильное выравнивание данных.

Это, конечно, не тот случай, когда вы получите идеальный результат, который ожидаете, если увидите эти примеры. Вы должны увидеть такую ​​картинку в качестве примера, чтобы доказать это.

Другие вопросы по тегам