gpt4 book ai didi

java - 使用模数和指数进行 RSA 解密

转载 作者:行者123 更新时间:2023-12-01 15:53:01 25 4
gpt4 key购买 nike

我的任务:我已将 (RSA) 数据和公钥加密为模数和指数。我得写解密代码。
我的问题:我的实现不起作用;)据我所知,哲学很简单 "open text"== rsa(public_key, rsa(private_key, "open text") ) 编辑:我的假设完全是错误的(假设是所有fu..ups之母;))。它应该是 "open text"== rsa(private_key, rsa(public_key, "open text")) 因为在 RSA 中,公钥用于加密,私有(private) key 用于解密。

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

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 感谢您提供重要线索。

最佳答案

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

  1. 数据应该使用公钥加密并使用私钥解密,而不是相反(因为拥有公钥的每个人都能够解密它......)
  2. 公钥应该与私钥匹配,否则,任何拥有任何私钥的人都可以解密使用任何公钥加密的数据...

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

关于java - 使用模数和指数进行 RSA 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5621503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com