2016-10-24 2 views
-2

У меня есть реализация алгоритма шифрования DES в JAVA (javax.crypto.Cipher), он успешно кодирует и расшифровывает (большинство) строки ... проблема в том, что иногда это специфичные для сообщения блоки (поскольку DES использует 8-символьные блоки в блочном режиме).Кодирование вывода шифрования JAVA DES

В моем случае почти всегда 3-й блок перепутался, и отдых показывает хорошо.

, например:

ключ: thisiskey

сообщение для шифрования: Google is an American multinational technology company specializing in Internet-related services

зашифрованное сообщение (в UTF-8):

mñqè•ÀPŒ�øf" 
ߦ\±õ¤ù'È9¢ëyT ÍQEÁ|;ëâÉ÷JWú 

Теперь, когда я иду и дешифрования это, я получаю это:

Decrypted сообщение:

Google i,í\O¯‹Ýbº-¸�¬ltinational technology company specializHôJ—=ÊÍnternet-related services 

Насколько я понимаю, этот вопрос, это связано с тем, что UTF-8 не может показать все символы и, таким образом, показывая, а также копирования для расшифровки, эта проблема возникает.

Может ли кто-нибудь предложить мне решение? Предпочтительно либо набор символов, который может обрабатывать это, либо способ преобразования Binary непосредственно в HEX (который может быть выведен для пользователя), а затем Vice Versa (расшифрованный после копирования/вставки) в JAVA.

EDIT Это «приблизительный» код, не точно (например, зашифрованное сообщение не правильно пастообразное состояние и эти части функции, но она должна дать идею). Даже в кодировке base64 я не могу получить эту дешифровку должным образом.

Encrypt Function code: 

boolean base64 = true; 
key = "thisiskey"; 
plainText = "Google is an American multinational technology company specializing in Internet-related services"; 

SecretKeyFactory MyKeyFactory = SecretKeyFactory.getInstance("DES"); 
byte[] keyBytes = key.getBytes(); 

DESKeySpec generatedKeySpec = new DESKeySpec(keyBytes); 
SecretKey generatedSecretKey = MyKeyFactory.generateSecret(generatedKeySpec); 

Cipher generatedCipher = Cipher.getInstance("DES"); 
generatedCipher.init(Cipher.ENCRYPT_MODE, generatedSecretKey); 

byte[] messsageStringBytes = plainText.getBytes(); 
byte[] encryptedMessage = generatedCipher.doFinal(messsageStringBytes); 

String encryptedMessageString = new String(encryptedMessage); 

if (base64) { 
    encryptedMessageString = Base64.getEncoder().encodeToString(encryptedMessageString.getBytes("utf-8")); 
} 

return encryptedMessageString; 

Расшифровать Код функции:

boolean dbase64 = true; 
dkey = "thisiskey"; 
messageToDecrypt = "mñqè•ÀPŒ�øf\"ߦ\±õ¤ù'È9¢ëyT ÍQEÁ|;ëâÉ÷JWú"; // Message from above code 

SecretKeyFactory MyKeyFactory = SecretKeyFactory.getInstance("DES"); 
byte[] dkeyBytes = dkey.getBytes(); 

DESKeySpec generatedKeySpec = new DESKeySpec(dkeyBytes); 
SecretKey generatedSecretKey = MyKeyFactory.generateSecret(generatedKeySpec); 

Cipher generatedCipher = Cipher.getInstance("DES"); 
generatedCipher.init(Cipher.DECRYPT_MODE, generatedSecretKey); 

if (dbase64) { 
    byte[] decodedBytes = Base64.getDecoder().decode(dencryptedText); 
    dencryptedText = new String(decodedBytes, "utf-8"); 
} 

byte[] messsageStringBytes = dencryptedText.getBytes(); 
byte[] encryptedMessage = generatedCipher.doFinal(messsageStringBytes); 

String decryptedMessageString = new String(encryptedMessage); 

return decryptedMessageString; 
+0

Как вы могли ожидать, что кто-нибудь сможет вам помочь без вашего кода? –

+1

DES - отличный алгоритм шифрования, если безопасность не требуется. DES был заменен AES, используйте AES. Пожалуйста, не создавайте плохую безопасность, у нас уже достаточно. – zaph

ответ

2

"зашифрованное сообщение в кодировке UTF-8" не имеет никакого смысла. Зашифрованный текст является двоичным, а не UTF-8. Вы должны положить его в byte[], а не String.

Если вам нужна строка, используйте Base64 или Hex.


Даже в кодировке base64, я не смог получить эту расшифрованы правильно.

String encryptedMessageString = new String(encryptedMessage); 

if (base64) { 
    encryptedMessageString = Base64.getEncoder().encodeToString(encryptedMessageString.getBytes("utf-8")); 
} 

Это не работает. Вы кодируете Base64 после того, как данные уже нарушены (по телефону new String). Не ставьте его в строку. Идите прямо от encryptedMessage (byte[]) к Base64.

+0

Итак, как вы предлагаете мне «показывать» текст для использования/копирования?вы можете немного помочь? – i333

+1

Если вам нужна строка, используйте Base64 или Hex-кодировку. Подробнее см. Связанные темы. – Thilo

Смежные вопросы