2014-01-17 163 views
1

我加密和使用此代碼字符串加密和解密的Android密鑰比較

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 
} 

這是如何我試圖做的,但是當我把正確的密鑰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!。請注意,我使用標準Java(不是Android)執行了我的測試,但我試圖修復要在Android上執行的代碼。

一些端註釋:

  • 你的trim()持續使用似乎有些奇怪。它似乎沒有實現任何東西。
  • 當您只使用equals()時,您使用contentEquals()
  • 指定DES作爲算法,將密碼模式和填充作爲默認值。你真的應該明確指出這兩者。
  • DES太弱,無法提供任何安全性,因此您可能需要考慮轉向更強大的算法。
+0

崩潰,如果我插入了錯誤的密鑰進行解密,如果我使用的密鑰長度小於8,它崩潰 –

+0

我試過這個'嘗試{ciphertext.equals(encrypted.trim()) ){// 顯示decryted味精 }其他{// 顯示錯鍵 } 趕上(NullPointerException異常E){ \t \t \t e.getMessage(); \t \t \t \t \t \t \t \t \t \t}' ATLEAST此代碼不會崩潰在錯誤的關鍵? –

+0

@OsamaAftab根據您的密碼模式和填充,當您使用錯誤的密鑰進行解密時,可能會出現異常。你必須抓住這些並顯示你的「錯誤的關鍵」的消息。我建議您在達到此功能之前驗證密鑰大小。 –