1

Я шифрования и дешифрования текста с помощью этого кодастроки, сравнивающие для секретного ключа шифрования и дешифрования андроида

public class Encryption { 
private static String charsetName = "UTF8"; 
private static String algorithm = "DES"; 
private static int base64Mode = Base64.DEFAULT; 

public String getCharsetName() { 
    return charsetName; 
} 

public void setCharsetName(String charsetName) { 
    this.charsetName = charsetName; 
} 

public String getAlgorithm() { 
    return algorithm; 
} 

public void setAlgorithm(String algorithm) { 
    this.algorithm = algorithm; 
} 

public int getBase64Mode() { 
    return base64Mode; 
} 

public void setBase64Mode(int base64Mode) { 
    this.base64Mode = base64Mode; 
} 

public static String encrypt(String key, String data) { 
    if (key == null || data == null) 
     return null; 
    try { 
     DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(charsetName)); 
     SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm); 
     SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); 
     byte[] dataBytes = data.getBytes(charsetName); 
     Cipher cipher = Cipher.getInstance(algorithm); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
     return Base64.encodeToString(cipher.doFinal(dataBytes), base64Mode); 
    } catch (Exception e) { 
     return null; 
    } 
} 

public static String decrypt(String key, String data) { 
    if (key == null || data == null) 
     return null; 
    try { 
     byte[] dataBytes = Base64.decode(data, base64Mode); 
     DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(charsetName)); 
     SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm); 
     SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); 
     Cipher cipher = Cipher.getInstance(algorithm); 
     cipher.init(Cipher.DECRYPT_MODE, secretKey); 
     byte[] dataBytesDecrypted = (cipher.doFinal(dataBytes)); 
     return new String(dataBytesDecrypted); 
    } catch (Exception e) { 
     return null; 
    } 
} 

} 

Я пытаюсь соответствовать ключ, что я помещен для шифрования & перед тем дешифрования, если оба ключи совпадают расшифровывать текст в противном случае подскажет мне wrongkey вот что я пытаюсь сделать

string a="sfdsfsjbgdfkbgdfkjbgk";//encrypted text just for assuming 

decrypted=Encryption.decrypt(key, a.trim()); 

encrypted=Encryption.encrypt(key, decrypted.trim()); 

if(a.contentEquals(encrypted.trim())){ 
//show the decrypted text 
} 

else 
{ 
//Show the wrong key 
} 

Это, как я пытаюсь сделать, но когда я поставил правильный ключ еще оператор выполняет и приложение останавливается на оператор if может кто-нибудь указать мне, что я делаю неправильно здесь.

+0

Пробовал ли вы шифрование и дешифрование одного и того же ключа, и значение возвращает то же самое? – Aiapaec

+0

Да, он возвращает одно и то же значение, если я пытаюсь показать в инструкции else. –

+0

@El_Mochiq любая идея? –

ответ

1

Я не могу воспроизвести вашу проблему. Вот немного SSCCE, что не в состоянии продемонстрировать проблему:

(Примечание: это было бы проще, если вы снабдил образец кода был также SSCCE)

import java.io.UnsupportedEncodingException; 
import java.security.GeneralSecurityException; 

import android.util.Base64 

import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESKeySpec; 

public class EncryptDecryptTest { 

    public static void main(String[] args) throws Exception { 
    String key = "12345678"; 
    String ciphertext = encrypt(key, "foo"); 

    String decrypted = decrypt(key, ciphertext.trim()); 
    String encrypted = encrypt(key, decrypted.trim()); 

    if (ciphertext.contentEquals(encrypted.trim())) { 
     System.out.println("decrypted!"); 
    } else { 
     System.out.println("wrong key!"); 
    } 
    } 

    public static String encrypt(String key, String data) 
     throws GeneralSecurityException, UnsupportedEncodingException { 
    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF8")); 
    SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES"); 
    SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); 
    byte[] dataBytes = data.getBytes("UTF8"); 
    Cipher cipher = Cipher.getInstance("DES"); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
    return Base64.encodeToString(cipher.doFinal(dataBytes), Base64.DEFAULT); 
    } 

    public static String decrypt(String key, String data) 
     throws GeneralSecurityException, UnsupportedEncodingException { 
    byte[] dataBytes = Base64.decode(data, Base64.DEFAULT); 
    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF8")); 
    SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES"); 
    SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); 
    Cipher cipher = Cipher.getInstance("DES"); 
    cipher.init(Cipher.DECRYPT_MODE, secretKey); 
    byte[] dataBytesDecrypted = (cipher.doFinal(dataBytes)); 
    return new String(dataBytesDecrypted); 
    }  
} 

Для меня, это печатает out decrypted! как и ожидалось. Обратите внимание, что я провел тестирование с использованием стандартной Java (не Android), но я попытался исправить код для запуска на Android.

Некоторые побочные комментарии:

  • Ваше постоянное использование trim() кажется странным. Кажется, он ничего не добивается.
  • Вы используете contentEquals(), когда можете просто использовать equals().
  • В качестве алгоритма вы указываете DES, который оставляет по умолчанию режим шифрования и отступы. Вы действительно должны указать оба из них явно.
  • DES слишком слаб, чтобы предлагать какую-либо защиту, поэтому вам может потребоваться перейти к более сильному алгоритму.
+0

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

+0

Я пробовал эту 'try { if (ciphertext.equals (encrypted.trim())) {// шоу decryted тзд } еще {// показать неправильный ключ } улов (NullPointerException е) { \t \t \t e.getMessage(); \t \t \t \t \t \t \t \t \t \t} ' по крайней мере, этот код не вылетает при неправильном ключе? –

+0

@OsamaAftab В зависимости от вашего режима шифрования и отступов вы можете получить исключения при расшифровке с неправильным ключом. Вам придется поймать их и отобразить сообщение «неправильного ключа». Я бы рекомендовал вам проверить размер ключа до достижения этой функции. –

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