using System;
using System.Security.Cryptography;
using System.Text;
public class Test
{
static void Main( string[] args )
{
string data = "hello";
Encrypt(data);
}
static void Encrypt( string data )
{
PaddingMode padding = PaddingMode.PKCS7;
CipherMode cipherMode = CipherMode.ECB;
int size = 128;
Console.WriteLine("input: '" + data + "'");
string officialKey = "9840822c-14fc-49ac-9d68-ac532f9f171e";
Console.WriteLine("key: '" + officialKey + "'");
Console.WriteLine("block size: '16'");
Console.WriteLine( "padding: '11'" );
var utf8dataBytes = Encoding.UTF8.GetBytes(data);
var utf8data = Encoding.UTF8.GetString(utf8dataBytes);
Console.WriteLine("utf8 json: '" + utf8data + "'");
Console.WriteLine("encoded key (utf8): " + officialKey);
var utf8KeyBytes = Encoding.UTF8.GetBytes(officialKey);
var myMD5 = MD5.Create();
var md5HashOfKey = myMD5.ComputeHash(utf8KeyBytes);
Console.WriteLine( "md5 hash of key (raw): " + DumpBinary(md5HashOfKey) );
Console.WriteLine("md5 hash of key (base64): " + Convert.ToBase64String(md5HashOfKey));
Console.WriteLine("BitConverter.ToString(md5HashOfKey): " + BitConverter.ToString(md5HashOfKey));
Console.WriteLine("BitConverter.ToString(md5HashOfKey).Replace(): " + BitConverter.ToString(md5HashOfKey).Replace("-",""));
byte[] encryptedBlob = null;
using ( var aes = new AesManaged() )
{
try
{
aes.Padding = PaddingMode.PKCS7;
aes.Mode = CipherMode.ECB;
aes.KeySize = 256;
aes.BlockSize = 128;
aes.Key = Encoding.ASCII.GetBytes(BitConverter.ToString(md5HashOfKey).Replace("-","").ToLower());
//aes.IV = new byte[] { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 };
var bytes = utf8dataBytes;
//var bytes = ForcePaddingManually( utf8dataBytes );
var cxform = aes.CreateEncryptor();
encryptedBlob = cxform.TransformFinalBlock( bytes, 0, bytes.Length );
Console.WriteLine("finished" + encryptedBlob.Length);
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
finally
{
aes.Clear();
}
}
//var encryptedBlob = AesAlgo.Encrypt( data, md5HashOfKey, padding, cipherMode, size );
Console.WriteLine("mcrypt (raw): " + DumpBinary(encryptedBlob));
Console.WriteLine("mcrypt: " + Encoding.UTF8.GetString(encryptedBlob));
var encryptedBase64 = Convert.ToBase64String(encryptedBlob);
Console.WriteLine( "presid: " + encryptedBase64 );
var encodedEncryptedBlob = encryptedBase64.Replace( "+", "-" ).Replace( "/", "_" );
Console.WriteLine( "sid: " + encodedEncryptedBlob );
Console.WriteLine("COMPLETE!");
}
static byte[] ForcePaddingManually( byte[] data )
{
// force padding manually to test that PKCS7 works like we are expecting
var pad = ( 16 - data.Length % 16 ) % 16;
var bytes = new byte[data.Length + pad];
for ( int i = 0; i < data.Length; ++i )
{
bytes[i] = data[i];
}
for ( int i = data.Length; i < data.Length + pad; ++i )
{
bytes[i] = (byte)pad;
}
return bytes;
}
static string DumpBinary( byte[] data )
{
var sb = new StringBuilder();
for ( int i = 0; i < data.Length; ++i )
{
sb.Append( data[i].ToString( "X2" ) );
}
return sb.ToString();
}
}