Проблема:
Невозможно успешно зашифровать и расшифровать строку с использованием шифрования 3DES из-за повторяющихся ошибок в коде реализация.
Решение:
Чтобы решить эту проблему, давайте проанализируем предоставленный код:
public class TripleDESTest { // ... public byte[] encrypt(String message) { // ... final byte[] plainTextBytes = message.getBytes("utf-8"); final byte[] cipherText = cipher.doFinal(plainTextBytes); final String encodedCipherText = new sun.misc.BASE64Encoder().encode(cipherText); return cipherText; } // ... }
Заблуждение о кодировании Base64:
Изначально код включал строку Final String encodedCipherText = new sun.misc.BASE64Encoder().encode(cipherText); для Base64, кодирующего зашифрованный текст перед его возвратом. Однако, поскольку в методе дешифрования не использовалась кодировка Base64, зашифрованный текст должен быть возвращен непосредственно в виде массива байтов.
Печать необработанных байтовых массивов:
код печатает как зашифрованные, так и расшифрованные данные в виде массивов байтов: System.out.println(codedtext); и System.out.println(декодированныйтекст);. Это не обеспечивает значимого вывода, поскольку массивы байтов не отображаются как удобочитаемые значения. Чтобы отобразить фактический расшифрованный текст, преобразуйте его в строку, используя new String(plainText, "UTF-8").
Исправленный код:
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(decodedtext); } 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
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3