当我想在Java中使用带有BouncyCastle API的RSA加密文件时,我遇到了一个问题。问题如下:在下面的代码中,我在其中创建一个RSAKeyParameters对象的行中,它的构造函数询问我三个参数:
1。如果我们想用公钥或私钥加密
2。具有键的模的BigInteger
3。具有键的指数的BigInteger。
我的方法接收的第一个参数是包含密钥的文件。在RSAKeyParameter的构造函数中,如何传递一个BigInteger,即模和指数?,如何从文件中获取模数和指数?
PD:包含密钥的文件有一个CR和LF,这就是为什么有两个readLine()。
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();
}
}
您当前正在字节数组上使用toString
。这只会返回对象引用的代表,这与数组中的值无关。
相反,您可以使用biginger
构造函数,该构造函数接受字符串和基数,使用16作为基数。但要确保十六进制表示中没有任何虚假或无效字符。
如果从文件中的十六进制转换的字节数组是传统的大端字节数组,那么要将正的大端字节数组转换为BigInteger,请查看javadoc for BigInteger的构造函数,该构造函数以int符号表示正,以大端字节数组表示大小。
“教科书”(未添加)RSA不安全;参见加密。SX安全。SX和维基百科。对大于一个数据块的数据使用RSA编码的方式将导致半随机失败,如果您纠正了这一点,那么ECB模式的效率低下且不安全;参见加密。SX安全。SX和维基百科。使用未经验证的公钥通常是不安全的。
如果你这样做是为了好玩,因为它让你觉得自己像一个“l33t黑客5R”或邦德超级恶棍,而不关心实际的安全,这是好的。如果您需要或想要实际的安全性,请删除此选项,并使用由知道他们在做什么的人编写的程序,和/或搜索“不要使用您自己的加密”。
在本章中,我们将重点介绍RSA密码加密的不同实现及其所涉及的功能。 您可以引用或包含此python文件以实现RSA密码算法实现。 加密算法包含的模块如下 - from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP from Crypto.Signature import PKCS1_v1_5 from Crypto
我当前在解密服务器上的RSA加密数据时遇到了问题,服务器使用Node.js并使用node-rsa库进行加密/解密。 在我的Android客户端上没有任何问题地接收到公钥,但是当尝试解密数据时,我得到了以下异常: 这就是我在客户端上生成公钥的方式 以下是客户端的加密:
问题内容: 我试图来回编码一个简单的String“ test”。 但是,尽管加密工作得很好(ALGORITHM是“ RSA”),但是当尝试解密刚刚从加密“ test”中获得的字符串时,出现以下异常: javax.crypto.IllegalBlockSizeException:数据不得超过256个字节 我是否应该将加密的字节分成256个块才能解密? 问题答案: 您无法可靠地将随机字节转换为。结果将
我们封装了一个RSA 加解密的工具放在 extends 中。首先看看它的文件结构 rsa |-- RSACrypt 加解密主程序 |-- RSACryptBigData 大数据加解密 |-- SignUtil 签名类 |-- rsa_public_key.pem 公钥 |-- rsa_private_key.pem 私钥 RSACrypt API RSAC
问题内容: 我正在尝试使用RSA算法在.NET中加密字符串,并在Java中解密结果。目前,我已经可以做相反的事情(用Java加密,用.NET解密)。这里有我的代码可以实际工作(JAVA加密): 和(.NET解密) 现在我想做相反的事情……但是我遇到了一些错误,例如(密钥的大小应该是128个字节……等等)我应该怎么做? 在这里,我添加当前的 无效 代码: 。净 爪哇 问题答案: Java解密代码的最
问题内容: 我正在使用RSA在JAVA上进行加密,并尝试使用.NET进行解密。我包括我的JAVA代码和.NET代码,希望有人对此有所了解。 JAVA代码: 从此JAVA代码中,我得到了加密字符串的结果,该结果恰好是: FOP4 AAIH6hcabXnrvNG5YUk + / + nBv9n9HU0CAgZjkIWQIDjbOpSwoPVBFERrZ6641x2QaoJw5yv18XAay 0WrC