2013-05-02 5 views
3

На стороне сервера encyption/decryption поля пароля выполняется на C#.Как использовать алгоритм 3DES на Android?

Теперь мне нужно реализовать те же функции в приложении для Android. Таким образом, я следовал этому учебнику: 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 для приведенной выше коды. Пожалуйста, помогите мне ...

+0

Возможный дубликат [Как использовать шифрование/дешифрование 3des в Java?] (Http://stackoverflow.com/questions/20227/how-do-i-use-3des-encryption-decryption-in-java) – RMalke

+0

3DES сейчас не рекомендуется. Используйте AES256. [This] (https://github.com/ryan652/EasyCrypt/) - отличная библиотека для безопасного шифрования AES на Android, которая поддерживает несколько типов данных. – Ryan

ответ

4

Используйте этот код для шифрования строки

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()); 
+0

Шифрование хорошо, что относительно функции decrytText? у вас есть источник для этого? –

+0

Расшифровка была выполнена на бэкэнд и обработана PHP. – onkar

+0

Хей @onkar. Можете ли вы опубликовать расшифрованную версию? – rwvaldivia

0

Triple DES называется "DESede" (DES с использованием одного DES Шифрование , Расшифровать, шифровать для шифрования) как в режиме исполнения Java, так и в Android. Таким образом, это встроенная функциональность, доступ к которой возможен через класс Cipher. В нем также перечислены доступные алгоритмы. Для тройного DES вы можете использовать «DESede/CBC/PKCS5Padding». Не забудьте указать его случайным IV из 8 байтов.

Тройной DES должен использоваться только для обратной совместимости. Если вы решите использовать его, по крайней мере, поставьте ему 24 байта ключевого материала, иначе есть вероятность, что ваш зашифрованный текст может быть взломан. Для более современного подхода используют AES, предпочтительно в аутентифицированном режиме, таком как GCM ("AES/GCM/NoPadding"). Обратите внимание, что для GCM требуется уникальное значение nonce из 12 байтов.