Я занимаюсь обратным проектированием некоторого кода, который расшифровывает данные, надеясь, что смогу зашифровать его обратно и получить те же данные, с которых он начал, по причинам, которые сделали бы этот вопрос слишком длинным и не по теме .
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
Мне все равно, но, возможно, это поможет ответить на вопрос.