&引用;javax.crypto.IllegalBlockSizeException“;从数据库解密数据时

&引用;javax.crypto.IllegalBlockSizeException“;从数据库解密数据时,java,Java,我想存储数据(用DES加密),然后从数据库中获取加密数据并将其显示为列表。但我有个问题。这是代码 public void EncryptDemo(){ try { FileInputStream keyfis = new FileInputStream("mainkey.key"); byte[] encodedKey = new byte[keyfis.available()]; keyfis.read(encodedKey);

我想存储数据(用DES加密),然后从数据库中获取加密数据并将其显示为列表。但我有个问题。这是代码

    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);
    }
}
加密和存储功能正常。但当我从数据库中获取数据时,我在解密(在字节[]明文=cipher.doFinal(DataDemo);)时会得到这个错误


有人能解决这个问题吗

您应该将
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;
}
公共列表划分为8(字节[]字节){
int length=bytes.length;
List returnValues=new ArrayList();
对于(int i=0;i
我找到了解决方案。但我认为这不是最好的

我将表
DataDemo
的类型从varbinary更改为image,一切都正常了。但我在数据库中存储的数据量比oigin数据重(大约4倍)

但至少我解决了我的问题


有谁有更好的解决方案吗?我很乐意听到你的消息。

可能有更好的解决方案,但这也是一个解决方案。我编辑了答案。注意:我没有测试代码,但应该是这样的。你的数据库是什么?如果是SQLite,则将加密数据存储为
blob
。无论数据库是什么,您都需要选择一种数据类型来存储和返回“纯二进制”与字符或数字数据。我使用的是Microsoft SQL Server 2012:)
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;
}