当前位置: 首页 > 面试题库 >

Java:使用DES解密对象时发生StreamCorruptedException

冯亮
2023-03-14
问题内容

我有两种方法来从Android内部存储中的文件进行加密保存和解密加载对象。

加密和保存过程已完成,没有任何问题,但是当我要加载对象StreamCorruptedException时,inputStream = new ObjectInputStream(cipherInputStream);

我搜索的次数越来越多,但没有找到解决问题的方法。所有其他解决方案都是为了延长插座寿命或类似的。

我的代码如下:

private static byte[] iv = { (byte) 0xB1, (byte) 0x15, (byte) 0xB5,
        (byte) 0xB7, (byte) 0x66, (byte) 0x43, (byte) 0x2F, (byte) 0xA4,
        (byte) 0xB1, (byte) 0x15, (byte) 0x35, (byte) 0xC7, (byte) 0x66,
        (byte) 0x58, (byte) 0x2F, (byte) 0x5F };

保存方法:(工作正常)

private static String saveToFile(Serializable object, String fileName,
        Context ctx) {
    try {
        Cipher cipher = null;
        cipher = Cipher.getInstance("DES");
        SecretKey key = KeyGenerator.getInstance("DES").generateKey();
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);

        cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
        SealedObject sealedObject = null;
        sealedObject = new SealedObject(object, cipher);
        CipherOutputStream cipherOutputStream = null;

        FileOutputStream fos = ctx.openFileOutput(fileName,
                Context.MODE_PRIVATE);
        cipherOutputStream = new CipherOutputStream(
                new BufferedOutputStream(fos), cipher);
        ObjectOutputStream outputStream = null;
        outputStream = new ObjectOutputStream(cipherOutputStream);
        outputStream.writeObject(sealedObject);
        outputStream.close();

        return "Save Complete!";

    } catch (IOException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (InvalidAlgorithmParameterException e) {
        e.printStackTrace();
        return e.getMessage();
    }
}

加载方法:(无法从中加载对象cipherInputStream

private static Serializable loadFromFile(String fileName, Context ctx) {
    Cipher cipher = null;
    Serializable userList = null;
    try {
        cipher = Cipher.getInstance("DES");

        // Code to write your object to file
        SecretKey key = KeyGenerator.getInstance("DES").generateKey();
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);

        cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        CipherInputStream cipherInputStream = null;

        FileInputStream fos = ctx.openFileInput(fileName);
        cipherInputStream = new CipherInputStream(new BufferedInputStream(
                fos), cipher);

        ObjectInputStream inputStream = null;
        inputStream = new ObjectInputStream(cipherInputStream);
        // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        SealedObject sealedObject = null;
        sealedObject = (SealedObject) inputStream.readObject();
        userList = (Serializable) sealedObject.getObject(cipher);
        inputStream.close();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (InvalidAlgorithmParameterException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (StreamCorruptedException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (IOException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
        return e.getMessage();
    } catch (BadPaddingException e) {
        e.printStackTrace();
        return e.getMessage();
    }
    return userList;
}

公开的保存和加载方法:

public Serializable loadPlayer(Context ctx) {
    return loadFromFile("player.dat", ctx);
}

public String savePlayer(Player player, Context ctx) {
    return saveToFile(player, "player.dat", ctx);

}

问题答案:

您正在犯至少两个主要错误。

  1. 您必须使用与加密相同的密钥来解密。您不仅可以生成一个随机密钥,而且还可以解密任何东西。密码学不是魔术。您将必须安排解密密钥以某种方式保留 并在必要时 安全地 传输并在解密步骤中使用。

  2. 您使用加密一次,SealedObject然后使用CipherOutputStream; 加密一次。然后反方向使用解密一次,CipherInputStream然后通过解密一次SealedObject。这实际上是行不通的,因为Cipher对象在发送者和接收者处都不处于可比较的状态,并且在任何情况下都是毫无意义的。丢失SealedObject或Cipher流。



 类似资料:
  • 本文向大家介绍java中DES加密解密,包括了java中DES加密解密的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接奉上代码: 代码一 代码二 以上就是本文关于DES加密解密的代码了,希望对大家学习java有所帮助。

  • 本文向大家介绍Java对称加密算法DES实例详解,包括了Java对称加密算法DES实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java对称加密算法DES。分享给大家供大家参考,具体如下: 一 DES算法概述 1、介绍 DES:Data Encryption Standard 数据加密标准。 2、DES算法参数 二 DES算法Java实现 三 实现效果 jdk des encry

  • 本文向大家介绍详解Java利用实现对称加密(DES、3DES、AES),包括了详解Java利用实现对称加密(DES、3DES、AES)的使用技巧和注意事项,需要的朋友参考一下 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了。 2)编程就是算法和数据结构,算法和数据结构是编程的灵魂。 注意,这可不是我说的,是无数程序员总结的,话说的很实在

  • 本文向大家介绍java 实现DES 加密解密的示例,包括了java 实现DES 加密解密的示例的使用技巧和注意事项,需要的朋友参考一下 以上就是java 实现DES 加密解密的示例代码的详细内容,更多关于java des加密解密的资料请关注呐喊教程其它相关文章!

  • 问题内容: 我的老师给我一个问题: “用Java创建对象时会发生什么”。 据我所知,创建对象时会发生内存分配,变量初始化和构造函数方法调用。 但是我的老师说我几乎是对的。后面的两件事是正确的,除了内存堆。相反,他说发生了内存分配。我认为对象存储在堆中,所以我的老师错了。你这样认为吗? 问题答案: 与往常一样,找到针对此类问题的解决方案的最佳位置是Java语言规范。 具体来说,从创建新实例的部分可以

  • 问题内容: 我正在尝试使用PHP mcrypt函数解密由Java Triple DES函数加密的密钥,但是没有运气。在下面找到Java代码 我想编写一个与上面的cryptoText Java函数等效的PHP函数。在生成由Java代码生成的用于加密的精确IV值时遇到困难,这是解密所必需的。 问题答案: 这等效于Java代码的PHP(我从The reference的注释中复制了PKCS#5-paddi