none
TripleDES, encriptación, criptografía. RRS feed

  • Pregunta

  • Hola a todos.

    Estoy trabajando con criptografía, concretamente con TripleDES (TripleDESCryptoServiceProvider).

    No he tenido problemas para encriptar o desencriptar.

    El desafío concreto es como  implementar (se puede implementar de diversas maneras) el algoritmo para que devuelva un resultado concreto dada una entrada y una llave en particular.

    Valor a encriptar: 04124D6FFFFFFB6F
    Llave a utilizar: 285952466408E64A5300EA85E8360C01
    Resultado: F3C831D0C4380E5D

    Si alguien implementa 3DES o tiene código de ejemplo que de este resultado, a ver si puede compartirlo para examinar.

    Saludos.
     

     


    Gabriel
    martes, 17 de marzo de 2009 18:18

Todas las respuestas

  • hola,

    La verdad no se si entendi que andas buscando, o sea es como utilizar 3DES, o la forma de obtener el resultado que necesitas?


    si es implementar o utilizar 3DES, es simple aqui un ejemplo:

    TripleDESCryptoServiceProvider Class

    veras que un poco mas debajo en el ejemplo del link esta la forma de pasarle un string, aunque tambien tiene el ejemplo de como encriptar un archivo.

    Por ahi habria que buscar la forma de evitar pasarle el valor del vector de inicializacion "V", pero creo que se puede si usas, como lo hacen en este link:

    TripleDES - Un ejemplo practico en C#

    como veras hacen que el propia clase TripleDESCryptoServiceProvider, genere la Key y el vector V, que es guardado, por ahi en tu caso solo el V deberias generalo de esta forma ya que la clave la tienes.

    Lo que no sabria decirte es si al variar el valor de V el resultado obtenido sera otra, seguramente si.
    Hasta donde se si el mensaje y la clave es la misma el resultado deberia ser simpre igual, o al menos en HASH es asi, mmm no se si sera asi en 3DES, ya que como veras utiliza un vector "V" que seguro influya en el resultado final.

    Bueno espero te sea de utilidad
    Saludos

    Leandro Tuttini
    miércoles, 18 de marzo de 2009 16:21

  • select GET_ALGORITMOSDES('-c','04124D6FFFFFFB6F','285952466408E64A') from dual
    select GET_ALGORITMOSDES('-d','3A1E445E1412057B','5300EA85E8360C01') from dual
    select GET_ALGORITMOSDES('-c','A1534C1BF8690ACE','285952466408E64A') from dual

    --F3C831D0C4380E5D

     

     

    ...

     

        public static String algoritmosDES(String tipoCryptografia,String msg, String keys){
            byte[] theKeyDecimal;
            theKeyDecimal = null;
            byte[] theMsgDecimal        = null;
           
            String  resultCryptografia;
           
            theKeyDecimal = hexToBytes(keys);
            theMsgDecimal = hexToBytes(msg);
           
            resultCryptografia  = cifrarDescifrar(tipoCryptografia, theMsgDecimal, theKeyDecimal);
           
            return resultCryptografia;
        }
       
        private static String cifrarDescifrar(String tipo, byte[] theMsgDecimal, byte[] theKeyDecimal){
            String  result              = null;
            byte[]  theCphDecimal       = null;
           
            //Pasar clave a la clase SecretKey
            try{
                KeySpec             keySpec             = new DESKeySpec(theKeyDecimal);
                SecretKeyFactory    secretKeyFactory    = SecretKeyFactory.getInstance("DES");
                SecretKey           secretKey           = secretKeyFactory.generateSecret(keySpec);
               
                //Inicializar el cifrado
                try{
                    Cipher          cipher              = Cipher.getInstance("DES/ECB/NoPadding");   
                   
                    //Escojer el modo de cifrado o descifrado.
                    if (tipo.equals("-c")){
                        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
                    }else if (tipo.equals("-d")){
                        cipher.init(Cipher.DECRYPT_MODE, secretKey);
                    }
                   
                    theCphDecimal   = cipher.doFinal(theMsgDecimal);
                    result          = bytesToHex(theCphDecimal);
                
                }//Inicializacion de cifrado
                catch (javax.crypto.NoSuchPaddingException nspe) {
                    nspe.printStackTrace();
                } //Instanciacion DES
                catch (javax.crypto.IllegalBlockSizeException ibse) {
                    ibse.printStackTrace();
                } //metodo doFinal
                catch (javax.crypto.BadPaddingException bpe) {
                    bpe.printStackTrace();
                } //metodo doFinal
            }catch(InvalidKeyException ike){
                ike.printStackTrace();
            }catch(InvalidKeySpecException ikse){
                ikse.printStackTrace();
            }catch(NoSuchAlgorithmException nsae){
                nsae.printStackTrace();
            } 
            return  result;
        }
       
        public static byte[] hexToBytes(String str) {
            byte[]  theReturn   = null;
           
            if (str == null) {
                return theReturn;
            } else if (str.length() < 2) {
                return theReturn;
            } else {
                int len = str.length() / 2;
                byte[] buffer = new byte[len];
                for (int i = 0; i < len; i++) {
                    String  caracter    = str.substring(i * 2, i * 2 + 2);
                    buffer[i] = (byte)Integer.parseInt(caracter, 16);
                }
                return buffer;
            }
        }
        public static String bytesToHex(byte[] data) {
           
            if (data == null) {
                return null;
            } else {
                int len = data.length;
                String str = "";
                for (int i = 0; i < len; i++) {
                    if ((data[i] & 0xFF) < 16)
                        str = str + "0" + java.lang.Integer.toHexString(data[i] & 0xFF);
                    else
                        str = str + java.lang.Integer.toHexString(data[i] & 0xFF);
                }
                return str.toUpperCase();
            }
        }   

     

    ...

    martes, 9 de agosto de 2011 17:53
  • Hola Gabriel_UY

    Aquí te sugiero el siguiente la información : http://jorgepedraza.wordpress.com/2011/01/29/funcion-cifrado-net/

    Cualquier cosa, por  favor avisame!

     

    Saludos.


    Developer .NET
    miércoles, 17 de agosto de 2011 9:47