2015-03-27 2 views
-1

Я написал простую программу шифрования и дешифрования в java. И я использую "AES" algorithm для шифрования и дешифрования. Он работает нормально, но в зашифрованных данных я получаю специальные символы, такие как "/","=" и т. Д.Шифровать данные без специального символа ("=")

Но я не хочу, чтобы специальные символы в зашифрованных данных были специально обработчиком «=». Потому что это вызывает проблему для моей дальнейшей обработки. Есть ли способ избежать специальных символов или одного оператора "=" в зашифрованных данных.

Я googled это, и я получил некоторое предложение, как, преобразовать данные в hashcode, поэтому hashcode шифрования не будет содержать специальный символ. Но в соответствии с предложениями, Hashcode шифрование не secret key основе, мне нужно шифрование с помощью secret key

Как achive это?

Любая помощь будет определена. Благодаря

Ниже приведена программа, которую я написал в Java:

public class EncDec 
{ 
    private static final String ALGO = "AES"; 
    private static final byte[] keyValue = "1234567891234567".getBytes(); 
    public static void main(String[] args) throws Exception 
    { 
     String testData = "ABC"; 
     String enc = encrypt(testData); 
     System.out.println("Encrypted data: "+enc); 
     String dec = decrypt(enc); 
     System.out.println("Decrypted data: "+enc); 
    } 
    public static String encrypt(String Data) throws Exception 
    { 

     Key key = generateKey(); 
     Cipher c = Cipher.getInstance(ALGO); 
     c.init(Cipher.ENCRYPT_MODE, key); 
     byte[] encVal = c.doFinal(Data.getBytes()); 
     String encryptedValue = new BASE64Encoder().encode(encVal); 
     return encryptedValue; 
    } 
    public static String decrypt(String encryptedData) throws Exception 
    { 
     try{ 
      Key key = generateKey(); 
      Cipher c = Cipher.getInstance(ALGO); 
      c.init(Cipher.DECRYPT_MODE, key); 
      byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); 
      byte[] decValue = c.doFinal(decordedValue); 
      String decryptedValue = new String(decValue); 
      return decryptedValue; 
     }catch(Exception e) 
     { 
      System.out.println("Something wrong.."); 
      return ""; 
     } 
    } 
    private static Key generateKey() throws Exception 
    { 
     Key key = new SecretKeySpec(keyValue, ALGO); 
     return key; 
    } 
} 

И я получил результат, как:

Зашифрованные данные: /ia3VXrqaaUls7fon4RBhQ==

Decrypted данные: ABC.

+3

знак равенства в конце является допустимым символом для кодирования Base64, который вы явно делаете в вашем коде.Как правило, ваш код должен иметь возможность обрабатывать любой тип String, независимо от содержимого. – mjuarez

+0

В частности, это дополнение, когда у вас нет нескольких трех байтов в качестве входных данных. – chrylis

+0

Я не понимаю, почему обфускация String должна быть проблемой для дальнейшей обработки. Не могли бы вы уточнить? – Juxhin

ответ

2

Возможно использование URL-безопасности базы 64 as defined in RFC 4648 section-5.

Чтобы использовать безопасную для URL базу 64, можно использовать the new Base64 class in java.util (начиная с Java 8). Если необходимо избегать =, тогда можно указать, чтобы не использовать прокладку. Декодер должен, конечно, быть сконфигурирован таким же образом:

Encoder urlEncoder = java.util.Base64.getUrlEncoder().withoutPadding(); 
String encoded = urlEncoder.encodeToString(new byte[] { (byte) 0xFF, (byte) 0xE0}); 
System.out.println(encoded); 

Decoder urlDecoder = java.util.Base64.getUrlDecoder(); 
byte[] decoded = urlDecoder.decode(encoded); 
System.out.printf("(byte) 0x%02X, (byte) 0x%02X%n", decoded[0], decoded[1]); 

результаты:

_-A 
(byte) 0xFF, (byte) 0xE0 

Обратите внимание, что это, вероятно, не в порядке, чтобы использовать базу 64 и просто удалить прокладку. В этом случае в зависимости от ввода могут быть возвращены + и /.

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

Именно поэтому URL-кодирование результата является менее оптимальным решением; вы не знаете, сколько символов нужно ускользнуть заранее, делая размер вывода непредсказуемым.

+0

Base64 имеет дело с символами из четырех групп. Сторона-отправитель может удалить конечные символы «=», а принимающая сторона - повторно вставить их перед декодированием из Base64. Добавьте столько, сколько необходимо, чтобы длина строки была кратной четыре. – rossum

+1

Решение Java 8 работает независимо от символов заполнения. –

0

Вместо преобразования в base64 encodingHEX encoding. Это работало отлично для меня

-1

Мы можем использовать метод encodeBase64URLSafe класса Base64

Base64.encodeBase64URLSafe("some text"); 
Смежные вопросы