Java RSA使用BouncyCastle API加密
当我想在Java中使用带有BouncyCastle API的RSA加密文件时,我遇到了一个问题。问题如下:在下面的代码中,我在其中创建了一个RSAKeyParameters对象,它的构造函数询问我三个参数: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
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();
}
}