Результаты расшифровки / шифрования шифра - PullRequest
0 голосов
/ 03 ноября 2018

Я занимаюсь обратным проектированием некоторого кода, который расшифровывает данные, надеясь, что смогу зашифровать его обратно и получить те же данные, с которых он начал, по причинам, которые сделали бы этот вопрос слишком длинным и не по теме .

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

Мне все равно, но, возможно, это поможет ответить на вопрос.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Терминология будет сбивать с толку. Существует 4 операции RSA, которые лучше всего описать как: подписание, проверка, шифрование, дешифрование. Отображая их на более низкий уровень и используя только язык шифрования и дешифрования, они отображают следующее:

пара для проверки подписи

  • подпись -> зашифровать закрытым ключом
  • проверка -> расшифровка с открытым ключом

пара шифрование-дешифрование

  • шифрование -> шифрование с открытым ключом
  • расшифровка -> расшифровка с закрытым ключом.

Как видите, каждая пара операций имеет закрытый ключ с одной стороны и открытый ключ с другой.

0 голосов
/ 03 ноября 2018

Как сказал @JamesKPolk в своем комментарии, RSA работает не так. RSA - это асимметричный алгоритм шифрования: есть два ключа, открытый и закрытый. Симметричный алгоритм (например, AES) имеет один ключ, который используется как для шифрования, так и для дешифрования, и этот ключ должен храниться в безопасности, за исключением отправляющей и получающей сторон.

Почему асимметричное шифрование?

  • Вы можете зашифровать открытым ключом (обычно чужим ключом, которым они поделились с вами), и они должны использовать свой закрытый ключ для его расшифровки. Любой может иметь открытый ключ (поэтому он открытый ), но его нельзя использовать для чтения зашифрованного сообщения. Вот где у вас проблемы.
  • Кроме того, вы можете зашифровать сообщение с помощью закрытого ключа (обычно вашего собственного), а любой другой может использовать ваш открытый ключ для его расшифровки. Вот как реализованы цифровые подписи: например, вы зашифруете дайджест документа, и любой может проверить вашу подпись, если у него есть ваш открытый ключ, но никто другой не мог бы подписать его.
...