2013-07-19 4 views
0

데이터 (DES로 암호화 됨)를 저장 한 다음 데이터베이스에서 암호화 된 데이터를 가져와 목록으로 표시하려고합니다. 그러나 나는 문제가있다. 여기에 코드가 있습니다."javax.crypto.IllegalBlockSizeException"데이터베이스에서 데이터를 해독 할 때

public void EncryptDemo(){ 
    try { 
     FileInputStream keyfis = new FileInputStream("mainkey.key"); 
     byte[] encodedKey = new byte[keyfis.available()]; 
     keyfis.read(encodedKey); 
     keyfis.close(); 
     Key KeyFromFile = new SecretKeySpec(encodedKey, "DES"); 
     Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
     String text=txtToEncryptData.getText(), output; 
     cipher.init(Cipher.ENCRYPT_MODE, KeyFromFile); 
     DataDemo = cipher.doFinal(text.getBytes()); 
     InsertIntoDataBase(); 
     //I store it as varbinary in database 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (NoSuchAlgorithmException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (NoSuchPaddingException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (InvalidKeyException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IllegalBlockSizeException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (BadPaddingException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

    public void DecryptDemo(){ 
    try { 
     FileInputStream keyfis = new FileInputStream("mainkey.key"); 
     byte[] encodedKey = new byte[keyfis.available()]; 
     keyfis.read(encodedKey); 
     keyfis.close(); 
     Key KeyFromFile = new SecretKeySpec(encodedKey, "DES"); 
     Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, KeyFromFile); 
     String sql = "{call SelectAll}"; 
     CallableStatement call = conn.prepareCall(sql); 
     call.execute(); 
     ResultSet result = call.getResultSet(); 
     DefaultListModel model = new DefaultListModel(); 
     while(result.next()){ 
      DataDemo = result.getBytes("TestData"); 
      byte[] plainText = cipher.doFinal(DataDemo); 
      String after = new String(plainText); 
      model.addElement(after); 
     } 
     lstDecryptResult.setModel(model); 
    } catch (SQLException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (NoSuchAlgorithmException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (NoSuchPaddingException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (InvalidKeyException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IllegalBlockSizeException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (BadPaddingException ex) { 
     Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

암호화 및 저장이 가능합니다. I는 데이터베이스에서 데이터를 취할 때, I 해독 (바이트 []의 평문이 = cipher.doFinal (DataDemo))이 에러 얻을

Jul 19, 2013 11:40:05 AM databaseencryptdecryptdemo.MainGUI DecryptDemo 
SEVERE: null 
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher 

사람이하는 용액을가 ???

+0

데이터베이스 란 무엇입니까? SQLite라면, 암호화 된 데이터를'blob'으로 저장하십시오. DB가 무엇이든 관계없이 "순수 바이너리"대 문자 또는 숫자 데이터를 저장하고 반환 할 데이터 유형을 선택해야합니다. –

+0

Microsoft SQL Server 2012를 사용합니다. –

답변

0

해결책을 찾았습니다. 그러나 나는 그것이 최선이 아니라고 생각합니다.

테이블 DataDemo의 유형을 varbinary에서 image로 변경했으며 모든 것이 올바르게되었습니다. 그러나 데이터베이스에있는 내 데이터 크기 저장소는 oigin 데이터보다 무거웠습니다 (약 4 배).

하지만 적어도 내 문제가 해결되었습니다.

누구에게 더 좋은 해결책이 있습니까? 나는 너에게서 듣고 싶어한다.

0

DataDemo 변수를 8 바이트 조각으로 나누어야합니다.

public List<Byte[]> divideInto8(Byte[] bytes) { 
    int length = bytes.length; 
    List<Byte[]> returnValues = new ArrayList<Byte[]>(); 
    for (int i = 0; i < length; i = i + 8) { 
     Byte[] thebytes = new Byte[8]; 
     for (int j = 0; j < 8; j++) { 

      thebytes[j] = bytes[i * 8 + j]; 
     } 
     returnValues.add(thebytes); 
    } 
    return returnValues; 
} 
+0

어떻게 할 수 있습니까 ??? –

+0

아마도 더 나은 솔루션이 있지만 해결책이기도합니다. 나는 대답을 편집했다. 참고 : 코드를 테스트하지는 않았지만 그렇게해야합니다. –

관련 문제