使用DES解密数据库数据时出现问题。 (使用填充密码解密时,输入长度必须是8的倍数) [英] Problem when decrypt database data with DES. (Input length must be multiple of 8 when decrypting with padded cipher)

查看:164
本文介绍了使用DES解密数据库数据时出现问题。 (使用填充密码解密时,输入长度必须是8的倍数)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



I want to store data (encrypted with DES) and then take the encrypted data from database and present it as a list. But I have a problem. Here is the code.

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);
    }
}





加密和存储是好的。但是当我从数据库中获取数据时,我在解密时遇到此错误:





The encrypt and storing is allright. But when I take data from database, I get this error when decrypt at:

byte[] plainText = cipher.doFinal(DataDemo);





错误是:



The error is:

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





任何解决方案???



Any solution???

推荐答案

我找到了解。但我认为这不是最好的。



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



但至少我解决了我的问题。



有没有人有更好的解决方案?我愿意听取你的意见。
I found the solution. But I think it's not the best.

I changed the type of table DataDemo from varbinary to image and everything became alright. But my data size store in database is heavier (about 4 times) than the oigin data.

But at least I solved my problem.

Does anyone have a better solution? I willing to hear from you.


这篇关于使用DES解密数据库数据时出现问题。 (使用填充密码解密时,输入长度必须是8的倍数)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆