Java RSA使用BouncyCastle API加密

Java RSA使用BouncyCastle API加密,java,encryption,rsa,bouncycastle,public-key-encryption,Java,Encryption,Rsa,Bouncycastle,Public Key Encryption,当我想在Java中使用带有BouncyCastle API的RSA加密文件时,我遇到了一个问题。问题如下:在下面的代码中,我在其中创建了一个RSAKeyParameters对象,它的构造函数询问我三个参数: 1.如果我们想用公钥或私钥加密。 2.具有键的模的大整数。 3.具有键的指数的BigInteger 我的方法接收的第一个参数是包含密钥的文件。那么在RSAKeyParameter的构造函数中,如何传递一个BigInteger,即模和指数?如何从文件中获取模和指数 PD:包含密钥的文件有一个C

当我想在Java中使用带有BouncyCastle API的RSA加密文件时,我遇到了一个问题。问题如下:在下面的代码中,我在其中创建了一个RSAKeyParameters对象,它的构造函数询问我三个参数:
1.如果我们想用公钥或私钥加密。
2.具有键的模的大整数。
3.具有键的指数的BigInteger

我的方法接收的第一个参数是包含密钥的文件。那么在RSAKeyParameter的构造函数中,如何传递一个BigInteger,即模和指数?如何从文件中获取模和指数

PD:包含密钥的文件有一个CR和LF,这就是为什么有两个readLine()


如果从文件中的十六进制转换的字节数组是传统的大端字节数组,要将正的大端字节数组转换为BigInteger,请查看构造函数,该构造函数以int符号表示正,以大端字节数组表示大小

“教科书”(未添加)RSA不安全;请参阅crypto.SX security.SX和维基百科。对大于一个数据块的数据使用RSA编码的方式将导致半随机失败,如果您纠正了这一点,那么ECB模式的效率低下且不安全;请参阅crypto.SX security.SX和维基百科。使用未经验证的公钥通常是不安全的


如果你这样做是为了好玩,因为它让你觉得自己像一个“l33t黑客5R”或邦德超级恶棍,而不关心实际的安全,这是好的。如果您需要或想要实际的安全性,请删除此选项,并使用由知道他们在做什么的人编写的程序,和/或搜索“不要使用您自己的加密”

您当前正在字节数组上使用
toString
。这将只返回对象引用的一个代表,它与数组中的值关系不大


相反,您可以使用,使用16作为基数。但是,请确保十六进制表示形式中没有任何虚假或无效字符。

注意,要加密的数据大小限制为小于RSA的密钥大小。如果您确实需要RSA(非对称加密)和大于密钥大小的数据,则可能需要混合加密。是的,请遵守Dave的建议,不要使用教科书中的RSA:需要安全填充模式,首选OAEP。是的,我解决了它,我使用了PKCS1加密。有一个BigInteger的构造函数接收字节数组,我不知道!不过还是谢谢你。顺便说一句,我是一名学生,我正在学习,所以如果我觉得自己像一个利特黑客或类似的东西,不要这样做that@victor26567我重读了我的答案,我没有看到任何暗示你是黑客的东西。请注意,在开发人员圈子中,黑客行为与破解或执行非法活动并不相同。我的平板电脑目前正在喷吐滑翔机的标志,我焦急地等待着我的终极黑客键盘。
void cifrar_asimetrica(String fichClave, String archivoClaro, String result, boolean conPrivada){

    byte[] modulo;
    byte[] exponente;

    try(
        BufferedReader lectorClave = new BufferedReader (new FileReader(fichClave));
        BufferedInputStream lectorFichero = new BufferedInputStream(new FileInputStream(archivoClaro));
        BufferedOutputStream fsalida = new BufferedOutputStream(new FileOutputStream(result))){

        modulo = Hex.decode(lectorClave.readLine()); 
        exponente = Hex.decode(lectorClave.readLine());


        RSAEngine cifrador = new RSAEngine();
        CipherParameters parametro = new RSAKeyParameters(conPrivada, new BigInteger(modulo.toString()), new BigInteger(exponente.toString()));

        cifrador.init(true,parametro); // vamos a cifrar

        byte[] datosLeidos = new byte[cifrador.getOutputBlockSize()];
        byte[] datosCifrados = new byte[cifrador.getOutputBlockSize()];
        int leidos = 0;
        //NO SE SI ES GETINPUTBLOCKSIZE O OUTPUT
        leidos = lectorFichero.read(datosLeidos, 0, cifrador.getOutputBlockSize());

        while(leidos > 0){
            datosCifrados = cifrador.processBlock(datosLeidos, 0, cifrador.getOutputBlockSize());
            fsalida.write(datosCifrados, 0, datosCifrados.length);
            leidos = lectorFichero.read(datosLeidos, 0, cifrador.getOutputBlockSize());
        }

    }catch(Exception e){
        e.printStackTrace();
    }
}