2017-03-26 41 views
1
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加密一样非常加密。 这是怎么回事?ECB Encryption的结果可能不同。它与CBC的结果是一样的

这里也是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(); 
    } 

} 
+0

你能举一些例子吗? –

+2

具有固定IV的CBC给出的结果与第一块非常类似于ECB。第二块会出现更多的差异。而DES现在已经过时,反而使用AES。 – rossum

回答

2

众所周知的pinguin picture有点玩脏。它只加密位图本身,而BMP文件也包含元数据。此外,它依赖于数据的正确对齐。

当然,如果你看到这些例子,你就会得到完美的结果。你应该看到这样的图片来证明这一点。

+0

谢谢!我很感激。 – ByungWuun