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

CipherInputStream和CipherOutputStream不生成文件

谭勇
2023-03-14
问题内容

我有以下代码。但是,文件b.xlsxc.xlsx是0字节。为什么CipherOuputSteam不工作?

public static void main(String[] args) throws Exception {

    KeyPair keys = KeyPairGenerator.getInstance("RSA").generateKeyPair();
    Cipher cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.ENCRYPT_MODE, keys.getPublic());

    FileInputStream fis;
    FileOutputStream fos;
    CipherOutputStream  cos;

    fis = new FileInputStream("C:/temp/a.xlsx");
    fos = new FileOutputStream("C:/temp/b.xlsx");

    cos = new CipherOutputStream (fos, cipher);

    byte[] block = new byte[8];
    int i;
    while ((i = fis.read(block)) != -1) {
        cos.write(block, 0, i);
    }
    cos.close();
    fos.close();



    cipher.init(Cipher.DECRYPT_MODE, keys.getPrivate());
    CipherInputStream cis1, cis2;
    fis = new FileInputStream("c:/temp/b.xlsx");
    CipherInputStream cis = new CipherInputStream(fis, cipher);
    fos = new FileOutputStream("c:/temp/c.xlsx");

    while ((i = cis.read(block)) != -1) {
        fos.write(block, 0, i);
    }
    fos.close();
    fis.close();
    cis.close();
}

问题答案:

问题出在您的用法上-这是不正确的,并且在实现中CipherOutputStream掩盖了一个非常重要的异常-
IllegalBlockSizeException

问题是您不能使用RSA密钥来加密长度超过密钥大小(示例中为128字节)的数据。您应该对大数据块使用对称加密算法,例如 AES

如果您出于某种原因(例如安全传输数据)使用非对称密钥-
您可以在此SO答案中找到一个很好的示例。



 类似资料:
  • 让我解释一下我的问题。 我想重写Socket和ServerSocket类,以便以这种方式加密我的消息: 1)客户端向服务器发送随机生成的对称密钥(AES算法) 2)之后,客户端和服务器可以3)为了交换对称密钥,客户端使用服务器的公钥对其进行加密(RSA算法) 我覆盖了Socket和ServerSocket,所以当客户端打开一个套接字时,它会自动发送由服务器公钥加密的对称密钥。服务器读取流中的前12

  • 问题内容: 实际上,我为此也从互联网和stackoverflow中进行了大量搜索, 最初,我在加密和解密中不使用填充, 但最后我从这里得到了解决方案 https://stackoverflow.com/a/10775577/1115788 并且我用填充作为AES / CBC / PKCS5Padding更新了我的代码,并且出现了相同的错误,并且最后一个块未解密… 我最近两天正在为此工作,但未找到解

  • 问题内容: 我正在尝试通过学习本教程来学习hyperjaxb 。我遵循了所有指示,直到标题部分。这包括以下步骤: 但是什么也没产生。没有目录,也没有。我对整个目录结构进行了关键字搜索,以确认运行后这些资源不存在。我也将目录结构导入到新的Eclipse Maven项目中,并在新的Eclipse Maven项目中进行了尝试,但同样缺少结果。 如何使本教程生成预期的生成文件? 另外,是否有更好的方法从x

  • 我正试图从各种类中生成清晰的文档,所有的JAX-RS都有注释,一些用java编写,一些用clojure编写。 我构建了一个maven项目,它只是依赖于包含服务类的war文件: 我无法生成任何服务文档。 当运行mvn发音:docs-X时,我看到我的类“注意到了”: [调试]注意到类 WEB-INF.classes.com.ws.scholar.resources.ClientResource in

  • 使用 Hexo 生成静态文件快速而且简单。 $ hexo generate 监视文件变动 Hexo 能够监视文件变动并立即重新生成静态文件,在生成时会比对文件的 SHA1 checksum,只有变动的文件才会写入。 $ hexo generate --watch 完成后部署 您可执行下列的其中一个命令,让 Hexo 在生成完毕后自动部署网站,两个命令的作用是相同的。 $ hexo generate

  • 我有一个项目配置与Gradle和Kotlin。这是一个命令行实用程序,我希望能够从我的终端运行生成的jar。但是,我得到以下错误: 用于生成jar的命令是,用于运行jar的命令是。 我试着遵循官方文档,也试着使用这些资源:1、2和3,但没有任何运气。