我正在对一些正在解密数据的代码进行反向工程,希望能够对reasons that would make this question too long and off-topic进行加密,并获得与开始时相同的数据。
public void Test() throws Exception {
String pk_enc = //...
String hashStr_64 = //...
byte[] hashStr_encrypted = Base64.decode(hashStr_64);
X509EncodedKeySpec e = new X509EncodedKeySpec(Base64.decode(pk_enc));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey RSApublicKey = (RSAPublicKey) keyFactory.generatePublic(e);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher.init(2, RSApublicKey); // '2' means decrypt
byte[] hashStr_decrypted = cipher.doFinal(hashStr_encrypted);
String hashStr_result = new String(hashStr_decrypted);
// Now in reverse...
Cipher cipher1 = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
// instantiating a new cipher or using the original one makes no difference
cipher1.init(1, RSApublicKey); // '1' means encrypt
byte[] hashStr_encrypted_reverse = cipher1.doFinal(hashStr_decrypted);
String hashStr_64_reverse = Base64.encode(hashStr_encrypted_reverse);
}
// Now in reverse...
之前的所有代码都无法更改,但这并不意味着不可能将hashStr_result
转换回hashStr_64
,对吗?
但是,我编写的代码应该做的不起作用。
hashStr_encrypted_reverse
与hashStr_encrypted
不同。为什么会这样,我该如何解决?
另一个迹象表明加密出现问题是如果我尝试再次解密...
// Decrypt again
Cipher cipher2 = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher2.init(2, RSApublicKey);
byte[] hashStr_decrypted_again = cipher.doFinal(hashStr_encrypted_reverse);
抛出:
javax.crypto.BadPaddingException
我并不在乎,但也许可以帮助回答这个问题。
答案 0 :(得分:2)
正如@JamesKPolk在他的评论中所说,这不是RSA的工作方式。 RSA是一种不对称加密算法:有两个密钥,即公用密钥和专用密钥。对称算法(例如AES)具有单个密钥,该密钥用于加密和解密,并且除了发送方和接收方外,必须保持该密钥的安全性。
为什么要使用非对称加密?
答案 1 :(得分:2)
术语会令人困惑。 RSA有4种操作,最好将其描述为:签名,验证,加密,解密。将它们映射到较低级别并仅使用加密和解密的语言,它们的映射如下:
签名验证对
加密-解密对
如您所见,每对操作的一侧都有私钥,而另一侧则有公钥。