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

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密钥。

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

最佳答案

从源头来看,CipherInputStream可以很好地处理由加密层引发的异常。我会完全避免使用它来支持简单的Cipher对象,例如

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.

10-08 09:39