Descifrado de cifrado / resultados de cambio de cifrado

Estoy realizando ingeniería inversa de algún código que está descifrando datos, con la esperanza de poder volver a cifrarlos y obtener los mismos datos con los que comenzó, por razones que harían esta pregunta demasiado larga y fuera de tema .

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);
}

Todo el código anterior // Now in reverse...no se puede cambiar, pero eso no significa que sea imposible hashStr_resultvolver a convertir hashStr_64, ¿verdad?

Sin embargo, el código que escribí después, que debería hacer eso, no funciona. hashStr_encrypted_reversees diferente de hashStr_encrypted. ¿Por qué es eso y cómo puedo solucionarlo?

Otra señal de que algo salió mal en el cifrado es lo que sucede si intento descifrar de nuevo ...

// Decrypt again
Cipher cipher2 = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher2.init(2, RSApublicKey);
byte[] hashStr_decrypted_again = cipher.doFinal(hashStr_encrypted_reverse);

Esto arroja:

javax.crypto.BadPaddingException

Realmente no me importa, pero tal vez podría ayudar a responder la pregunta.

Respuesta 1

La terminología será confusa. Hay 4 operaciones RSA, mejor descritas como: firma, verificación, cifrado, descifrado. Mapeando estos a un nivel inferior y usando solo el lenguaje de encriptación y desencriptación, estos mapean de la siguiente manera:

par de verificación de signos

  • firma -> cifrar con clave privada
  • verificar -> descifrar con clave pública

encriptar-desencriptar par

  • cifrar -> cifrar con clave pública
  • descifrar -> descifrar con clave privada.

Como puede ver, cada par de operaciones tiene la clave privada en un lado y la clave pública en el otro.

Respuesta: 2

La asignación es simple, todo lo que tenemos que hacer es hacer que el código cree una ventana con un panel rojo con un solo botón y etiqueta. Aquí está el código hasta ahora, así como la clase de probador. Tengo la etiqueta para ...

Estoy tratando de desactivar la exposición automática, el enfoque automático y el balance de blancos automático en la muestra Camera2Basic de Google. Aquí está mi código: private void disableAutomatics () {try {mPreviewRequestBuilder ....

Estoy usando apache poi versión 4.0.0 y estoy tratando de hacer muchos grupos de columnas como la imagen a continuación: No sé si es posible usar poi. He intentado con el método XSSFSHeet.groupColumn () ...

Esto es algo con lo que me encontré tratando de resolver la pregunta de otra persona aquí, en una versión simplificada. El Cliente y el Servidor con dependencia reflexiva (circular) usan genéricos para tratar de mantenerse fuertemente tipados ...