Java RSA加密的AES密钥

时间:2015-03-30 19:57:35

标签: java encryption cryptography aes rsa

我有一个RSA私钥,我试图解密其中包含AES密钥的其他文件内容。到目前为止,我似乎只能从流程中返回,这是行话。在下面的代码中不确定我做错了什么。我已经看过google并且已经看到了至少100种不同的方式。

import java.io.*;
import java.io.IOException;

import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.GeneralSecurityException;
import java.security.spec.PKCS8EncodedKeySpec;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;

import org.apache.commons.codec.binary.Base64;

import org.apache.commons.io.FileUtils;

public class RsaEncryption {
    private Cipher _pkCipher;

    public RsaEncryption() throws GeneralSecurityException {
        // create RSA public key cipher
        _pkCipher = Cipher.getInstance("RSA");
    }

    public String loadKey(File in, String privateKey) throws GeneralSecurityException, IOException, Exception {
        privateKey = privateKey.replaceAll("-+.*?-+", "");
        byte[] encodedKey = Base64.decodeBase64(privateKey);

        // create private key
        PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedKey);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        RSAPrivateKey pk = (RSAPrivateKey) kf.generatePrivate(privateKeySpec);

        // read AES key
        _pkCipher.init(Cipher.DECRYPT_MODE, pk);
        byte[] encryptedBytes       = FileUtils.readFileToByteArray(in);
        ByteArrayInputStream fileIn = new ByteArrayInputStream(encryptedBytes);
        CipherInputStream cis       = new CipherInputStream(fileIn, _pkCipher);
        DataInputStream dis         = new DataInputStream(cis);
        byte[] decryptedData        = new byte[32];
        dis.read(decryptedData);
        String key = new String(decryptedData);
        return key;
    }
}

更新

弹性城堡pem转换器的新方法仍无法正常工作

import java.io.StringReader;
import java.io.File;
import java.io.IOException;

import java.security.KeyPair;
import java.security.interfaces.RSAPrivateKey;
import java.security.GeneralSecurityException;
import java.security.interfaces.RSAPublicKey;

import javax.crypto.Cipher;

import org.apache.commons.io.FileUtils;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;

public class RsaEncryption {
    private Cipher _pkCipher;
    private RSAPrivateKey _PrivateKey;
    private RSAPublicKey  _PublicKey;

    public RsaEncryption(String privateKey) throws GeneralSecurityException, IOException {
        loadKey(privateKey);
        // create RSA public key cipher
        _pkCipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
    }

    private void loadKey(String privateKey) throws IOException {
        PEMParser pemParser          = new PEMParser(new StringReader(privateKey));
        PEMKeyPair pemKeyPair        = (PEMKeyPair) pemParser.readObject();
        JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
        KeyPair keyPair              = converter.getKeyPair(pemKeyPair);
        _PrivateKey                  = (RSAPrivateKey) keyPair.getPrivate();
        _PublicKey                   = (RSAPublicKey) keyPair.getPublic();
        pemParser.close();
    }

    public String decrypt(File in) throws GeneralSecurityException , IOException{
        _pkCipher.init(Cipher.DECRYPT_MODE, _PrivateKey);
        byte[] encryptedBytes = FileUtils.readFileToByteArray(in);
        String key = new String(_pkCipher.doFinal(encryptedBytes));
        System.out.println(key);
        return key;
    }


    public RSAPrivateKey getPrivateKey() { return _PrivateKey; }
    public RSAPublicKey getPublicKey()   { return _PublicKey;  }
}

2 个答案:

答案 0 :(得分:0)

RSA只能加密必须作为块处理的少量数据。你不需要一个流。只需致电

byte[] aesKey = _pkCipher.doFinal(FileUtils.readFileToByteArray(in));

获取AES密钥。

答案 1 :(得分:0)

JCE jars一旦放入正确的目录,在错误的目录中工作正常。