Normalerweise tritt bei der Verwendung von 3DES zum Ver- und Entschlüsseln von Zeichenfolgen in Java ein häufiges Problem auf, das dazu führt, dass der Chiffretext nicht erfolgreich entschlüsselt werden kann . Gibt die ursprüngliche Zeichenfolge zurück. Dieser Artikel enthält ein einfaches Codebeispiel, mit dem eine Zeichenfolge ver- und entschlüsselt und auf die ursprüngliche Zeichenfolge zurückgesetzt werden kann.
In der ursprünglichen Frage weist der angegebene Code den folgenden Fehler auf:
Der korrigierte Code lautet wie folgt:
import java.security.MessageDigest; import java.util.Arrays; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class TripleDESTest { public static void main(String[] args) throws Exception { String text = "kyle boon"; byte[] codedtext = new TripleDESTest().encrypt(text); String decodedtext = new TripleDESTest().decrypt(codedtext); System.out.println(codedtext); // this is a byte array, you'll just see a reference to an array System.out.println(decodedtext); // This correctly shows "kyle boon" } public byte[] encrypt(String message) throws Exception { final MessageDigest md = MessageDigest.getInstance("md5"); final byte[] digestOfPassword = md.digest("HG58YZ3CR9" .getBytes("utf-8")); final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); for (int j = 0, k = 16; j < 8;) { keyBytes[k++] = keyBytes[j++]; } final SecretKey key = new SecretKeySpec(keyBytes, "DESede"); final IvParameterSpec iv = new IvParameterSpec(new byte[8]); final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, iv); final byte[] plainTextBytes = message.getBytes("utf-8"); final byte[] cipherText = cipher.doFinal(plainTextBytes); final String encodedCipherText = new sun.misc.BASE64Encoder() .encode(cipherText); return cipherText; } public String decrypt(byte[] message) throws Exception { final MessageDigest md = MessageDigest.getInstance("md5"); final byte[] digestOfPassword = md.digest("HG58YZ3CR9" .getBytes("utf-8")); final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); for (int j = 0, k = 16; j < 8;) { keyBytes[k++] = keyBytes[j++]; } final SecretKey key = new SecretKeySpec(keyBytes, "DESede"); final IvParameterSpec iv = new IvParameterSpec(new byte[8]); final Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); decipher.init(Cipher.DECRYPT_MODE, key, iv); final byte[] encData = new sun.misc.BASE64Decoder().decodeBuffer(message); final byte[] plainText = decipher.doFinal(encData); return new String(plainText, "UTF-8"); } }
Nachdem die korrekten Base64-Codierungs- und Decodierungsschritte verwendet wurden, kann der Code die Zeichenfolge erfolgreich mit 3DES verschlüsseln und entschlüsseln und das entschlüsselte Ergebnis sicherstellen wird korrekt auf die ursprüngliche Zeichenfolge zurückgesetzt.
Das obige ist der detaillierte Inhalt vonWarum gelingt es der 3DES-Verschlüsselung und -Entschlüsselung in Java normalerweise nicht, den Chiffretext wieder in die ursprüngliche Zeichenfolge zu entschlüsseln, und wie kann dieses Problem gelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!