如何在Android上使用3DES算法?

在服务器端,密码字段的加密/解密在C#中完成。

现在,我需要在我的Android应用程序中实现相同的function。 所以,我按照本教程: http : //ttux.net/post/3des-java-encrypter-des-java-encryption/如下:

import java.security.MessageDigest; import java.security.spec.KeySpec; import java.util.Arrays; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; import org.apache.commons.codec.binary.Base64; public class Encrypter { private KeySpec keySpec; private SecretKey key; private IvParameterSpec iv; public Encrypter(String keyString, String ivString) { try { final MessageDigest md = MessageDigest.getInstance("md5"); final byte[] digestOfPassword = md.digest(Base64.decodeBase64(keyString.getBytes("utf-8"))); final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); for (int j = 0, k = 16; j < 8;) { keyBytes[k++] = keyBytes[j++]; } keySpec = new DESedeKeySpec(keyBytes); key = SecretKeyFactory.getInstance("DESede").generateSecret(keySpec); iv = new IvParameterSpec(ivString.getBytes()); } catch(Exception e) { e.printStackTrace(); } } public String encrypt(String value) { try { Cipher ecipher = Cipher.getInstance("DESede/CBC/PKCS5Padding","SunJCE"); ecipher.init(Cipher.ENCRYPT_MODE, key, iv); if(value==null) return null; // Encode the string into bytes using utf-8 byte[] utf8 = value.getBytes("UTF8"); // Encrypt byte[] enc = ecipher.doFinal(utf8); // Encode bytes to base64 to get a string return new String(Base64.encodeBase64(enc),"UTF-8"); } catch (Exception e) { e.printStackTrace(); } return null; } public String decrypt(String value) { try { Cipher dcipher = Cipher.getInstance("DESede/CBC/PKCS5Padding","SunJCE"); dcipher.init(Cipher.DECRYPT_MODE, key, iv); if(value==null) return null; // Decode base64 to get bytes byte[] dec = Base64.decodeBase64(value.getBytes()); // Decrypt byte[] utf8 = dcipher.doFinal(dec); // Decode using utf-8 return new String(utf8, "UTF8"); } catch (Exception e) { e.printStackTrace(); } return null; } } 

但我不知道我需要为上面的代码提供KeyValue和ivValue的值。 请帮帮我…

使用此代码加密您的字符串

 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import android.util.Base64; //string encryption public class EncryptionHelper { // Encrypts string and encode in Base64 public static String encryptText(String plainText) throws Exception { // ---- Use specified 3DES key and IV from other source -------------- byte[] plaintext = plainText.getBytes();//input byte[] tdesKeyData = Constants.getKey().getBytes();// your encryption key byte[] myIV = Constants.getInitializationVector().getBytes();// initialization vector Cipher c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding"); SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede"); IvParameterSpec ivspec = new IvParameterSpec(myIV); c3des.init(Cipher.ENCRYPT_MODE, myKey, ivspec); byte[] cipherText = c3des.doFinal(plaintext); String encryptedString = Base64.encodeToString(cipherText, Base64.DEFAULT); // return Base64Coder.encodeString(new String(cipherText)); return encryptedString; } } 

这是你加密字符串的方法

 String encryptedPassword = EncryptionHelper.encryptText(edtText.getText().toString()); 

在Java和Android运行时中,三重DES称为"DESede" (DES使用单个DES加密,解密,加密加密)。 所以它是内置的function,可以通过Cipher类访问。 它还列出了可用的算法。 对于三重DES,您可以使用“DESede / CBC / PKCS5Padding”。 不要忘记为它提供8字节的随机IV。

三重DES应仅用于向后兼容。 如果你决定使用它至少提供24字节的密钥材料,否则你的密文有可能被破解。 对于更现代的方法,使用AES,优选地在诸如GCM( "AES/GCM/NoPadding" )的认证模式中。 请注意,GCM需要12个字节的唯一nonce。