You are not logged in.

#1 17 May 2010 5:42 am

chrisbloom7
New Member
Registered: May 2010
Posts: 3

How do you decrypt the hex string from the TripleDes example?

I have been using your example at http://sanity-free.org/131/triple_des_b … sharp.html as the basis for my own TripleDES decryption scheme between a .NET client and a PHP application. I have gotten to the point where the encryption works in both .NET and PHP, and I can decrypt in PHP, but I haven't been able to figure out how to decrypt using C#. Basically I need to know what the reverse function would be for the supplied bin2hex function so that I can get the transmitted hexadecimal string back to binary to run through the decryptor. Can anyone provide some feedback?

Thanks

Offline

 

#2 17 May 2010 6:54 am

chrisbloom7
New Member
Registered: May 2010
Posts: 3

Re: How do you decrypt the hex string from the TripleDes example?

Well, I think I've hacked my way out of the box. I'm not a .NET programmer, so this may be clunky, but here's what I've come up with. (Note the code is from my test script inside Snippet Compiler and I have no idea how one would make it run outside of that program. I merely needed to show proof of concept.)

Code:

using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;

public class MyClass
{
    public static void RunSnippet()
    {
        // ENCRYPTING
        string result = SimpleTripleDes("Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.");
        WL(result);
        WL("");
        
        // DECRYPTING
        result = SimpleTripleDesDecrypt("51196a80db5c51b8523220383de600fd116a947e00500d6b9101ed820d29f198c705000791c07ecc1e090213c688a4c7a421eae9c534b5eff91794ee079b15ecb862a22581c246e15333179302a7664d4be2e2384dc49dace30eba36546793be");
        WL(result);
        
        // PAUSE
        RL();
    }
    
    static string SimpleTripleDes(string Data) {
        byte[] key = Encoding.ASCII.GetBytes("passwordDR0wSS@P6660juht");
        byte[] iv = Encoding.ASCII.GetBytes("password");
        byte[] data = Encoding.ASCII.GetBytes(Data);
        byte[] enc = new byte[0];
        TripleDES tdes = TripleDES.Create();
        tdes.IV = iv;
        tdes.Key = key;
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.Zeros;
        ICryptoTransform ict = tdes.CreateEncryptor();
        enc = ict.TransformFinalBlock(data, 0, data.Length);
        return ByteArrayToString(enc);
    }
    
    static string SimpleTripleDesDecrypt(string Data) {
        byte[] key = Encoding.ASCII.GetBytes("passwordDR0wSS@P6660juht");
        byte[] iv = Encoding.ASCII.GetBytes("password");
        byte[] data = StringToByteArray(Data);
        byte[] enc = new byte[0];
        TripleDES tdes = TripleDES.Create();
        tdes.IV = iv;
        tdes.Key = key;
        tdes.Mode = CipherMode.CBC;
        tdes.Padding = PaddingMode.Zeros;
        ICryptoTransform ict = tdes.CreateDecryptor();
        enc = ict.TransformFinalBlock(data, 0, data.Length);
        return Encoding.ASCII.GetString(enc);
    }
    
    public static string ByteArrayToString(byte[] ba) {
        string hex = BitConverter.ToString(ba);
        return hex.Replace("-","");
    }
    
    public static byte[] StringToByteArray(String hex) {
        int NumberChars = hex.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }
    
    #region Helper methods
    
    public static void Main()
    {
        try
        {
            RunSnippet();
        }
        catch (Exception e)
        {
            string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString());
            Console.WriteLine(error);
        }
        finally
        {
            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }
    }

    private static void WL(object text, params object[] args)
    {
        Console.WriteLine(text.ToString(), args);    
    }
    
    private static void RL()
    {
        Console.ReadLine();    
    }
    
    private static void Break() 
    {
        System.Diagnostics.Debugger.Break();
    }

    #endregion
}

Offline

 

#3 17 May 2010 7:04 am

chrisbloom7
New Member
Registered: May 2010
Posts: 3

Re: How do you decrypt the hex string from the TripleDes example?

Here is the accompanying PHP code.

Code:

<?php
// very simple ASCII key and IV
$key = "passwordDR0wSS@P6660juht";
$iv = "password";

$cipher = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');

// ENCRYPTING
printvar(
  SimpleTripleDes('Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.'),
  'Encrypted:'
);

// DECRYPTING
printvar(
  SimpleTripleDesDecrypt('51196a80db5c51b8523220383de600fd116a947e00500d6b9101ed820d29f198c705000791c07ecc1e090213c688a4c7a421eae9c534b5eff91794ee079b15ecb862a22581c246e15333179302a7664d4be2e2384dc49dace30eba36546793be'),
  'Decrypted:'
);

function SimpleTripleDes($buffer) {
  global $key, $iv, $cipher;
  printvar($buffer, 'Encrypting:');

  // get the amount of bytes to pad
  $extra = 8 - (strlen($buffer) % 8);
  //printvar($extra, 'Padding with n zeros');

  // add the zero padding
  if($extra > 0) {
    for($i = 0; $i < $extra; $i++) {
      $buffer .= "\0";
    }
  }

  mcrypt_generic_init($cipher, $key, $iv);
  $result = bin2hex(mcrypt_generic($cipher, $buffer));
  mcrypt_generic_deinit($cipher);
  return $result;
}

function SimpleTripleDesDecrypt($buffer) {
  global $key, $iv, $cipher;
  printvar($buffer, 'Decrypting:');

  mcrypt_generic_init($cipher, $key, $iv);
  $result = rtrim(mdecrypt_generic($cipher, hex2bin($buffer)), "\0");
  mcrypt_generic_deinit($cipher);
  return $result;
}

function hex2bin($data)
{
  $len = strlen($data);
  return pack("H" . $len, $data);
} 

// HELPER FUNCTIONS

function printvar($var, $label="") {
    print "<pre style=\"border: 1px solid #999; background-color: #f7f7f7; color: #000; overflow: auto; width: auto; text-align: left; padding: 1em;\">" .
        (
            (
                strlen(
                    trim($label)
                )
            ) ? htmlentities($label)."\n===================\n" : ""
        ) .
        htmlentities(print_r($var, TRUE)) . "</pre>";
}
?>

Offline

 

#4 17 May 2010 1:48 pm

MadHatter
Administrator
From: Dallas TX
Registered: Jun 2006
Posts: 529
Website

Re: How do you decrypt the hex string from the TripleDes example?

Looks like you've nailed it. 

The only thing I'd suggest is instead of using Encoding.ASCII use Encoding.UTF8 to encode / decode the original string (in C#).  That way you're able to encode / decode a much larger string set than just ascii.

Offline

 



© 2003 - 2014 NullFX
Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License