使用模数和指数的RSA解密

时间:2011-04-11 12:47:55

标签: java encryption rsa bouncycastle

我的任务:我已将加密(RSA)数据和公钥作为模数和指数。我必须写解密码 我的问题:我的实现不起作用;)据我所知哲学很简单“open text”== rsa(public_key,rsa(private_key,“open text”)) ) 编辑:我的假设完全是错误的(假设是所有fu..ups的母亲;))。它应该是"open text" == rsa(private_key, rsa(public_key, "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是重要的线索。

1 个答案:

答案 0 :(得分:0)

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

  1. 数据应使用公钥加密并使用私钥解密,而不是相反(因为每个拥有公钥的人都可以解密它...)
  2. 公钥应与私钥匹配,否则,任何拥有私钥的人都可以解密使用任何公钥加密的数据......
  3. 此外,对于非常长的数据,您不应使用公钥加密。相反,在一些其他算法(RC4,AES等)中加密数据并在RSA中加密密钥(类似于PGP方法)