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; 
    } 
} 

} 

이 코드를 사용하여 텍스트를 해독하고있어 키는 내가이 내가 할 노력하고있어 어떻게

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 
} 

할 노력하고있어 텍스트, 그렇지 않으면 나를 여기 wrongkey 프롬프트입니다 해독 일치하지만 내가 넣을 때 올바른 키 else 문은 실행하고 응용 프로그램에 대한 중지 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); 
    }  
} 

이 인쇄 예상대로 decrypted!을 출력하십시오. Android (Android가 아닌) 표준 Java를 사용하여 테스트를 수행했지만 Android에서 실행되도록 코드를 복구하려고 시도했음을 유의하십시오.

일부 측면 댓글 :

  • trim() 귀하의 지속적인 사용은 이상한 것 같다. 아무것도 달성하지 못하는 것 같습니다.
  • equals()을 사용할 수있는 경우 contentEquals()을 사용합니다.
  • DES을 알고리즘으로 지정하면 암호 모드와 채우기가 기본값으로 유지됩니다. 당신은 정말로 그 두 가지를 명시 적으로 지정해야합니다.
  • DES가 너무 약해서 보안을 제공 할 수 없으므로 더 강력한 알고리즘으로 이동하는 것이 좋습니다.
+0

암호 해독에 잘못된 키를 삽입하면 충돌이 발생하고 8보다 작은 키 길이를 사용하면 충돌이 발생합니다. –

+0

if (ciphertext.equals (encrypted.trim()) try { if) { // 쇼 decryted MSG } 다른 {잘못된 // 쇼 키 } 캐치 (NullPointerException이 전자) { \t \t \t e.getMessage(); \t \t \t \t \t \t \t \t \t \t}' 이어야이 코드는 잘못된 키에 있지 충돌합니까? –

+0

@OsamaAftab 암호 모드 및 패딩에 따라 잘못된 키를 사용하여 암호를 해독 할 때 예외가 발생할 수 있습니다. 당신은 그것들을 잡아서 당신의 "틀린 열쇠"메시지를 보여야 할 것입니다. 이 기능을 사용하기 전에 키 크기의 유효성을 검사하는 것이 좋습니다. –