-
-
Save darinkes/3726896 to your computer and use it in GitHub Desktop.
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; | |
} | |
} | |
} |
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-----
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