当前位置: 首页 > 知识库问答 >
问题:

Java cipherinputstream将所有输入数据转换为0

拓拔曦
2023-03-14

我正在编写一个使用RSA密码和AES密码的公钥和私钥加密算法的实现。在这种方法中,AES密钥应该使用RSA密码流进行解密。

public void loadKey(File in, byte[] privateKey) throws GeneralSecurityException, IOException {

    PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKey);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    PrivateKey pk = kf.generatePrivate(privateKeySpec);
    rsacipher.init(Cipher.DECRYPT_MODE, pk);

    aesKey = new byte[128/8];
    FileInputStream fis = new FileInputStream(in);
    CipherInputStream input = new CipherInputStream(fis, rsacipher);
    input.read(aesKey);
    aesKeySpec = new SecretKeySpec(aesKey, "AES");
    input.close();
    fis.close();
 } 

FileInputStream为我提供了编码密钥(这不是问题),但当通过CipherInputStream时,数据会变成全零。

aesKey和aesKeySpec是静态变量,privateKey是有效的RSA密钥。

任何帮助在发现问题将不胜感激!

共有2个答案

欧奇希
2023-03-14

您正在忽略InputStream的返回值。读取(字节[])方法:

input.read(aesKey);

此调用不保证一次读取等于传递字节数组长度的字节数,应使用一个循环,并从输入流反复读取到数组的剩余部分:

int offset = 0;
while (offset < aesKey.length) {
    int read = input.read( aesKey, offset, aesKey.length - offset );
    if (read < 0) {
         throw new EOFException();
    } else {
         offset += read;
    }
}

或者您可以将流包装成DataInputStream并使用DataInputStream.readFully(byte[])方法(基本上包含与上述相同的代码)。

伏建修
2023-03-14

查看源代码,CipherInputStream在处理加密层抛出的异常方面做得很好。我会完全避免使用它,而是选择一个简单的密码对象,例如。

byte[] fileData = FileUtils.readFileToByteArray(in); // from commons-lang
Cipher c = new Cipher("RSA/None/PKCS1Padding");
c.init(Cipher.DECRYPT_MODE, pk);
aesKey = c.doFinal(fileData);
// etc.
 类似资料:
  • 问题内容: 我是JAVA的新手,我正在尝试将JTextField的输入转换为整数,我尝试了很多选项,但是没有任何作用,蚀总是给我一个错误,并且这些错误对我来说没有意义。 导入java.awt.Graphics; 导入java.awt.Color; 问题答案: 代替: 试试这个: 您不能解析为,但是 可以解析 其包含的 值 -文本。

  • 问题内容: Python中如何将输入数据转换为数字? 问题答案: Python 2.x 有两个函数用于获取用户输入,分别称为和。它们之间的区别是,不评估数据并以字符串形式原样返回。但是,将对你输入的内容进行评估,评估结果将返回。例如, 5 + 17评估数据,结果为22。当它对表达式求值时5 + 17,它将检测到你要添加两个数字,因此结果也将是同一int类型。因此,类型转换是免费完成的,并22作为的

  • 问题内容: 我将输入流从Web转换为位图时遇到问题。仅当输入图像类型为.BMP(位图)时,才会出现问题。在这种情况下: bitmapFactory.decodeStream返回null 。 有什么提示如何解决此问题,或者应该在哪里继续调试? 平台:Android(蜂窝) 问题答案: 谢谢@Amir指出日志。发现了一条线: 这似乎是一个普遍的问题。进行搜索后,我找到了解决方案。 我以前的代码: 起作

  • 我正在尝试从位于的文件导入数据https://drive.google.com/file/d/1leOUk4Z5xp9tTiFLpxgk_7KBv3xwn5eW/view进入数据帧。我试过使用 但是我得到一个错误说"ParserError:错误标记化数据。C错误:期望在行231中有9个字段,看到10"我不想使用'error_bad_lines=False'并跳过数据行。 请帮忙。

  • 我正在处理一个带有列“到期日期”的表,作为所有数据格式为DD/MM/YYYY的varchar。 表的创建者在此到期日期列中使用了错误的类型,现在客户端需要过滤并显示当前日期之前和之后的所有记录作为时间。这意味着需要将类型更改为date或datetime类型才能使用CURDATE()函数。 但是,值的当前格式不满足并且不允许类型更改,除非格式更改为YYYY-MM-DD(或类似)。 是否有任何方法可以

  • 我试图制作一个程序,将一个老的GBA游戏的地图分成16x16个瓷砖,保存每个瓷砖,然后将每个抓取的瓷砖的原始图像数据与另一个保存的瓷砖列表进行比较,并自动确定是否是相同的图像。到目前为止,我已经将地图划分为16x16块,自动将每个16x16块保存到一个新的图像文件中,然后将所有这些图像文件作为BufferedImages加载到一个数组中。 我现在要做的是分析一个数组中每个块(一个BufferedI