2012-06-30 2 views
2

У меня есть вопрос относительно шифрования и дешифрования строкишифровать и дешифровать строку

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

byte[] input = getByteArray(filePath);//get the message stored in a file as a byte array 

, пройдя через какой-то учебник я сумел получить сообщение типа String в массив байтов и зашифрованы его с помощью javax.crypto

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 

cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 

шифрованные мс г является retrived как массив байт

byte[] encrypted 

я даже сумел расшифровать его с помощью обратного метода и получить сообщение снова

, но моя проблема возникает, когда я пытаюсь преобразовать этот зашифрованный массив байт строки (в передать его через сеть) , а затем повторно преобразовать его в массив

байт я судимое это

String encryptedStrn = new String(encrypted); // convert to string 

, когда я преобразовать его в байтовый массив на byte [] enc = encryptedStrn.getBytes();

и использовать этот массив массивов для дешифрования, но вывод не подходит.

Я пропустил некоторые основные вещи, касающиеся преобразования. Пожалуйста, помогите мне. Заранее спасибо

+1

Не используйте 'encryptedStrn.getBytes()'. Используйте кодировку Base64. – CodesInChaos

+0

DES тоже довольно слаб. Вместо этого используйте AES. – CodesInChaos

+0

@CodeInChaos У меня проблема с преобразованием байтов в строку. –

ответ

4

Как написал CodeInChaos в комментарии, вы не должны использовать конструктор String(byte[]) для создания строки из непрозрачных двоичных данных. Строковые конструкторы предназначены для текстовых данных , которые были закодированы с использованием такой кодировки, как ASCII, UTF-8 и т. Д. Непрозрачные двоичные данные, такие как результат шифрования или файл изображения, являются не закодированные текстовые данные в том же так что вы теряете информацию.

Вместо этого вы должны использовать base64, который кодирует любые двоичные данные в ASCII. Для этого существуют различные сторонние библиотеки, в том числе хорошие public domain one. Кроме того, на Android вы можете просто использовать класс Base64.

Кроме того, даже если вы являются кодирование или декодирование в реальном текст, вы не должны использовать String.getBytes() и String(byte[]) конструктор в любом случае - они используют кодировку платформы по умолчанию, которая почти всегда неправильный выбор. Вместо этого вы должны использовать перегрузки, которые явно принимают CharSet или имя кодировки символов. UTF-8, как правило, является хорошим кодированием для использования, если вы можете контролировать оба конца - если вы контролируете только один конец, вам нужно знать, какая кодировка ожидает другой конец.

+0

Спасибо, что направили меня в правильном направлении. Информация, которую вы предоставили, мне очень полезна –

0

Вы должны base64-кодировать шифрованный текст. Не просто конвертируйте его в строку. Строка не является контейнером для двоичных данных.

0
public string EncryptUser(string userID) 
    { 
     using (var cryptoProvider = new DESCryptoServiceProvider()) 
     using (var memoryStream = new MemoryStream()) 
     using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(DESKey, DESInitializationVector), CryptoStreamMode.Write)) 
     using (var writer = new StreamWriter(cryptoStream)) 
     { 
      writer.Write(userID); 
      writer.Flush(); 
      cryptoStream.FlushFinalBlock(); 
      writer.Flush(); 
      return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length); 
     } 
    } 


    public string DecryptUserID(string userID) 
    { 
     using (var cryptoProvider = new DESCryptoServiceProvider()) 
     using (var memoryStream = new MemoryStream(Convert.FromBase64String(userID))) 
     using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(DESKey, DESInitializationVector), CryptoStreamMode.Read)) 
     using (var reader = new StreamReader(cryptoStream)) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 
Смежные вопросы