Implement AES encryption/decryption
This commit is contained in:
+61
-7
@@ -18,7 +18,15 @@ namespace LibIRD
|
|||||||
/// "3IRD"
|
/// "3IRD"
|
||||||
/// </summary>
|
/// </summary>
|
||||||
///
|
///
|
||||||
protected static readonly byte[] Magic = new byte[] { 0x33, 0x49, 0x52, 0x44 };
|
public static readonly byte[] Magic = new byte[] { 0x33, 0x49, 0x52, 0x44 };
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// AES encryption/decryption keys and initial values
|
||||||
|
/// </summary>
|
||||||
|
public static readonly byte[] D1AesKey = { 0x38, 0x0B, 0xCF, 0x0B, 0x53, 0x45, 0x5B, 0x3C, 0x78, 0x17, 0xAB, 0x4F, 0xA3, 0xBA, 0x90, 0xED };
|
||||||
|
public static readonly byte[] D1AesIV = { 0x69, 0x47, 0x47, 0x72, 0xAF, 0x6F, 0xDA, 0xB3, 0x42, 0x74, 0x3A, 0xEF, 0xAA, 0x18, 0x62, 0x87 };
|
||||||
|
public static readonly byte[] D2AesKey = { 0x7C, 0xDD, 0x0E, 0x02, 0x07, 0x6E, 0xFE, 0x45, 0x99, 0xB1, 0xB8, 0x2C, 0x35, 0x99, 0x19, 0xB3 };
|
||||||
|
public static readonly byte[] D2AesIV = { 0x22, 0x26, 0x92, 0x8D, 0x44, 0x03, 0x2F, 0x43, 0x6A, 0xFD, 0x26, 0x7E, 0x74, 0x8B, 0x23, 0x93 };
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -173,13 +181,36 @@ namespace LibIRD
|
|||||||
protected void GenerateD1(byte[] key)
|
protected void GenerateD1(byte[] key)
|
||||||
{
|
{
|
||||||
// Validate key
|
// Validate key
|
||||||
if (key == null)
|
if (key == null || key.Length <= 0)
|
||||||
throw new ArgumentNullException(nameof(key));
|
throw new ArgumentNullException(nameof(key));
|
||||||
if (key.Length != 16)
|
if (key.Length != 16)
|
||||||
throw new ArgumentException("Disc Key must be a byte array of length 16", nameof(key));
|
throw new ArgumentException("Disc Key must be a byte array of length 16", nameof(key));
|
||||||
|
|
||||||
// TODO: AES decryption
|
// AES decryption
|
||||||
Data1Key = key;
|
using (Aes aes = Aes.Create())
|
||||||
|
{
|
||||||
|
// Validate aes is available
|
||||||
|
if (aes == null)
|
||||||
|
throw new InvalidOperationException("AES not available. Change your system settings");
|
||||||
|
|
||||||
|
// Set AES settings
|
||||||
|
aes.Key = D1AesKey;
|
||||||
|
aes.IV = D1AesIV;
|
||||||
|
aes.Padding = PaddingMode.None;
|
||||||
|
aes.Mode = CipherMode.CBC;
|
||||||
|
|
||||||
|
// Perform AES decryption
|
||||||
|
using (ICryptoTransform decryptor = aes.CreateDecryptor())
|
||||||
|
{
|
||||||
|
MemoryStream ms = new MemoryStream();
|
||||||
|
CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write);
|
||||||
|
cs.Write(key, 0, 16);
|
||||||
|
cs.FlushFinalBlock();
|
||||||
|
Data1Key = ms.ToArray();
|
||||||
|
ms.Close();
|
||||||
|
cs.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -191,13 +222,36 @@ namespace LibIRD
|
|||||||
protected void GenerateD2(byte[] id)
|
protected void GenerateD2(byte[] id)
|
||||||
{
|
{
|
||||||
// Validate id
|
// Validate id
|
||||||
if (id == null)
|
if (id == null || id.Length <= 0)
|
||||||
throw new ArgumentNullException(nameof(id));
|
throw new ArgumentNullException(nameof(id));
|
||||||
if (id.Length != 16)
|
if (id.Length != 16)
|
||||||
throw new ArgumentException("Disc ID must be a byte array of length 16", nameof(id));
|
throw new ArgumentException("Disc ID must be a byte array of length 16", nameof(id));
|
||||||
|
|
||||||
// TODO: AES encryption
|
// AES encryption
|
||||||
Data2Key = id;
|
using (Aes aes = Aes.Create())
|
||||||
|
{
|
||||||
|
// Validate aes is available
|
||||||
|
if (aes == null)
|
||||||
|
throw new InvalidOperationException("AES not available. Change your system settings");
|
||||||
|
|
||||||
|
// Set AES settings
|
||||||
|
aes.Key = D2AesKey;
|
||||||
|
aes.IV = D2AesIV;
|
||||||
|
aes.Padding = PaddingMode.None;
|
||||||
|
aes.Mode = CipherMode.CBC;
|
||||||
|
|
||||||
|
// Perform AES encryption
|
||||||
|
using (ICryptoTransform encryptor = aes.CreateEncryptor())
|
||||||
|
{
|
||||||
|
MemoryStream ms = new MemoryStream();
|
||||||
|
CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write);
|
||||||
|
cs.Write(id, 0, 16);
|
||||||
|
cs.FlushFinalBlock();
|
||||||
|
Data2Key = ms.ToArray();
|
||||||
|
ms.Close();
|
||||||
|
cs.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
Reference in New Issue
Block a user