2014-01-17 119 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根据您的密码模式和填充,当您使用错误的密钥进行解密时,可能会出现异常。你必须抓住这些并显示你的“错误的关键”的消息。我建议您在达到此功能之前验证密钥大小。 –