Java 使用模和指数的RSA解密

Java 使用模和指数的RSA解密,java,encryption,rsa,bouncycastle,Java,Encryption,Rsa,Bouncycastle,我的任务:我将加密(RSA)数据和公钥作为模和指数。我必须写解密代码。 我的问题:我的实现不起作用;)据我所知,哲学是简单的“开放文本”==rsa(公钥,rsa(私钥,开放文本))编辑:我的假设是错误的(假设是所有fu..ups;)之母)。它应该是“open text”==rsa(私钥,rsa(公钥,open text)),因为在rsa中,公钥用于加密,私钥用于解密。 我假设我可以拥有与加密期间使用的私钥不对应的公钥,因此对于测试,我以以下方式创建了自己的密钥: openssl genrsa -

我的任务:我将加密(RSA)数据和公钥作为模和指数。我必须写解密代码。
我的问题:我的实现不起作用;)据我所知,哲学是简单的“开放文本”==rsa(公钥,rsa(私钥,开放文本))编辑:我的假设是错误的(假设是所有fu..ups;)之母)。它应该是
“open text”==rsa(私钥,rsa(公钥,open text))
,因为在rsa中,公钥用于加密,私钥用于解密。


我假设我可以拥有与加密期间使用的私钥不对应的公钥,因此对于测试,我以以下方式创建了自己的密钥:

openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
我使用命令获得了公钥模数和指数:

openssl x509 -in server.crt -text
对于加密测试,我使用的是代码

//Reads private key from file
//StringPasswordFinder is my tmp implementation of PasswordFinder
PEMReader pemReader = new PEMReader(new FileReader("/path/to/server.key"), new StringPasswordFinder());
KeyPair keyPair = (KeyPair) pemReader.readObject();
PrivateKey pk = keyPair.getPrivate();
//text for encryption
String openText = "openText";
//encryption
Cipher rsaCipher = Cipher.getInstance("RSA", "BC");
rsaCipher.init(Cipher.ENCRYPT_MODE, pk);
byte[] encrypted = rsaCipher.doFinal(openText.getBytes("utf-8"));
对于加密文本的解密,我使用代码

//modulus hex got using openssl
byte[] modulus = Hex.decodeHex("very long hex".toCharArray());
//exponent hex got using openssl
byte[] exponent = Hex.decodeHex("010001".toCharArray());
//initialization of rsa decryption engine
RSAEngine rsaEngine = new RSAEngine();
rsaEngine.init(false, new RSAKeyParameters(false, new BigInteger(modulus), new BigInteger(exponent)));
//input - encrypted stream
ByteArrayInputStream bais = new ByteArrayInputStream(encrypted);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//reading blocks from the input stream and decrypting them
int bytesRead = 0;
byte[] block = new byte[rsaEngine.getInputBlockSize()];
while ((bytesRead = bais.read(block)) > -1) {
    baos.write(rsaEngine.processBlock(block, 0, bytesRead));
}
//dispalying decrypted text
System.out.println(new String(baos.toByteArray(), "utf-8"));
毕竟显示的文本不是。谁能告诉我哪里错了


编辑:总结这个问题没有解决办法。因为不可能使用私钥加密消息,然后使用公钥解密它。一般来说,我把加密和消息签名、解密和验证混为一谈。因为在签名过程中使用私钥,而在验证过程中使用公钥。顺便说一句,MByD thx是一条重要线索。

我对RSA的java库不太熟悉,我尝试在java中实现RSA的时候是自己构建所有计算,但是如果我理解您的正确性,我会发现两个问题:

  • 数据应该用公钥加密,用私钥解密,而不是反过来(因为每个拥有公钥的人都可以解密它…)
  • 公钥应该与私钥匹配,否则,任何拥有私钥的人都可以解密使用任何公钥加密的数据

  • 另外,对于非常长的数据,不应使用公钥加密。相反,请使用其他算法(RC4、AES等)加密数据,并使用RSA加密密钥(类似于PGP方法)

    谢谢。就是这样。我使用私钥进行签名(而不是应该使用的公钥)。改变后,它开始工作。