Created
September 15, 2012 07:59
-
-
Save darinkes/3726896 to your computer and use it in GitHub Desktop.
AesDecryptor.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Globalization; | |
using System.IO; | |
using System.Linq; | |
using System.Security.Cryptography; | |
using System.Text; | |
using System.Text.RegularExpressions; | |
using System.Threading; | |
using System.Threading.Tasks; | |
namespace AesDecryptor | |
{ | |
class Program | |
{ | |
private static Regex _privateKeyRegex = new Regex(@"^-+ *BEGIN (?<keyName>\w+( \w+)*) PRIVATE KEY *-+\r?\n(Proc-Type: 4,ENCRYPTED\r?\nDEK-Info: (?<cipherName>[A-Z0-9-]+),(?<salt>[A-F0-9]+)\r?\n\r?\n)?(?<data>([a-zA-Z0-9/+=]{1,72}\r?\n)+)-+ *END \k<keyName> PRIVATE KEY *-+", RegexOptions.Compiled | RegexOptions.Multiline); | |
public static byte[] ConvertHexStringToByteArray(string hexString) | |
{ | |
if (hexString.Length % 2 != 0) | |
{ | |
throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString)); | |
} | |
byte[] HexAsBytes = new byte[hexString.Length / 2]; | |
for (int index = 0; index < HexAsBytes.Length; index++) | |
{ | |
string byteValue = hexString.Substring(index * 2, 2); | |
HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture); | |
} | |
return HexAsBytes; | |
} | |
static void Main(string[] args) | |
{ | |
Match privateKeyMatch = null; | |
Stream privateKey = new MemoryStream(Encoding.ASCII.GetBytes(Resourcen.AES_128_CBC)); | |
using (StreamReader sr = new StreamReader(privateKey)) | |
{ | |
var text = sr.ReadToEnd(); | |
privateKeyMatch = _privateKeyRegex.Match(text); | |
} | |
if (!privateKeyMatch.Success) | |
{ | |
Console.Write("Invalid private key file.\n"); | |
} | |
var keyName = privateKeyMatch.Result("${keyName}"); | |
var cipherName = privateKeyMatch.Result("${cipherName}"); | |
var salt = privateKeyMatch.Result("${salt}"); | |
var data = privateKeyMatch.Result("${data}"); | |
byte[] decryptedData = null; | |
switch (cipherName) | |
{ | |
case "AES-128-CBC": | |
Console.Write("Decrypting AES-128-CBC\n"); | |
var binaryData = System.Convert.FromBase64String(data); | |
byte[] binarySalt = ConvertHexStringToByteArray(salt); | |
MD5 md5 = MD5.Create(); | |
byte[] password = Encoding.UTF8.GetBytes(Resourcen.PASSPHRASE); | |
byte[] mysalt = new byte[8]; | |
Buffer.BlockCopy(binarySalt, 0, mysalt, 0, 8); | |
int preKeyLength = password.Length + mysalt.Length; | |
byte[] preKey = new byte[preKeyLength]; | |
Buffer.BlockCopy(password, 0, preKey, 0, password.Length); | |
Buffer.BlockCopy(mysalt, 0, preKey, password.Length, 8); // get first 8 bytes of iv | |
byte[] mykey = md5.ComputeHash(preKey); | |
md5.Clear(); | |
md5 = null; | |
RijndaelManaged aes128 = new RijndaelManaged(); | |
aes128.Mode = CipherMode.CBC; | |
aes128.Padding = PaddingMode.PKCS7; | |
aes128.KeySize = 128; | |
aes128.BlockSize = 128; | |
aes128.Key = mykey; | |
aes128.IV = binarySalt; | |
ICryptoTransform rijndaelDecryptor = aes128.CreateDecryptor(); | |
decryptedData = rijndaelDecryptor.TransformFinalBlock(binaryData, 0, binaryData.Length); | |
break; | |
default: | |
Console.Write("Not Part of this tool yet: " + cipherName); | |
break; | |
} | |
if (decryptedData != null) | |
{ | |
Console.Write("Decrypted Key:\n\n" + System.Convert.ToBase64String(decryptedData) + "\n\n"); | |
} | |
Console.Write("Press Enter to quit\n"); | |
Console.ReadLine(); | |
return; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Test key with Passphrase "tester":
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,A8B993177AE83E5476797236484F7CB6
tgMoS/2KhL+p/KslJVfX1RYiJtu3MlHA9gLu4Cq+yG63Yo4eLJmxV11CxSFGhamx
mPhSh6KDxj5VV1BQm6jsY4sabZARZRuwwFnpGOHUsGCU7zfY3GTDhYfCHDhjXuhy
LBloxq+5DafcagqFG1AZyJEJV0ZxGb0jbxWU13frKIEr5WvUbNN/XamBo2UffmNu
Mumc/tl0sFih134PNAPvG53R99vuup5aAe7L72OmLEU3UqEH8Sm6i1Y0XKV/CB3I
BoO7lsu8bk+QWl0ZsPULXEejub+P12Q08ySM6wXHDsTex6D09vIYZsoaG0lzbglJ
LnMAXkVzvJOup5wYJgtpDJG1p1QtEvYjV94wyRoGWz9+7Nc9NlhgTeV02u6c2y0m
GZ/ok7Jkc1HGLi9N3MIdLQ56l25DChZv0VqS95tmoRrtAnxXpk5MVsSVdBH8OC7E
DyE++sdw6E5w3B596xJaJFnt3mz3+l5OdXd1/nASx3Oklq+nQ9GA2CKvOUYrQBqn
JO30lMTm77iFXXUTitXFN7Z5KLNoBV8exHKhWTEqKq+BjBTrUx9y/gDQ3Bz/T1hN
iuBtesIt5UdCpXKpG6klqfMZPDbRZCWCf6Kuby8+Lw5yCPgI6L5Wj2y69Cnbjva5
1vbmVQkXmjBUlM29huE9iI9Qsoc2Ws0TflXaHpO5ovN0mhuU9UpTXNwwIZbsGZBI
Fa8tToU8Z+xV/cktHJdwuFGWL9MwMvc6JdvRI/AZ9CVe/bahXlp/ETIX3xCs1dmm
MU+xh9t+fje8Ms7HNmHmbS4SQPnf0GA9BaQsA7HzblzE/xYh0nrLirXGVagUv7UJ
OPqBvxtrIbSbpgHjDkXcYlF1qdYBaTsh3CaDLcShBPz9GlC9XFh2S4imtJy+ESz9
wRtZMEZ4R9LchrK8ElEQbPvv2M9UsjLEi70idWKcHAuws05/IIQ6AgRnRoiuRb5Q
d71Hcbwt9X16PrfRSYRMNKoNmWQwTUvGFmIOc8HQYUPvHxdbTJYwha9rl+jecdd+
ExoUx0xhR+bXWoFPMqRzvGrFEOfjZ+JycSInhY/3cop7+m1xEk3nlc2ZH0Bm2E73
R1fkmJoj5/StLh2sNr+PCCVd2k70X/jfrgLvHqCtQPkdNlJnEV0tFchyaGealxCX
JtsAHIH4YgE5Ojnxb3aFJAsELKzTHYalR2pz1rwR1LWeT2bBpGq7R7Mh2tUg7BKc
1I9JfgzGi8X2+o+UHnzXPoVEEY1Snxkbni2jmQ06uoLaTow3qwUPExGE2J7CMOxZ
KYUy2T1aGGnIIzhYPslPU5BPEPmTDukk76B5Rvam0fvXwE4mv4YR0kb/XHYN7cEl
InDGFKnTcgLJfU/B+IxVoG9ZYIndlCgia1YMeXR+mqX0EdzCYmFxMNqW6QD5uzoC
LTNOQtqwiDAvWbLZcqkzT6YnGjN6TBJEnVY4nvZRpyHxFN5qcQnjfMNqc/V47H0u
GHy3G9CPTezdd7CGtb2sfDrls446rS8R9Zm15/2Y8sxysYXGZC/yv8a4QTnJn4lX
omJXeM2qa9U4lK44MhtHj+eLveKQokkJEHN1yeRUMWcbb4r2QSzbpwjjfna0QKBP
-----END RSA PRIVATE KEY-----