using System.Collections.Generic;
using System.Security.Cryptography;
public static string ByteArrayToHexString(byte[] byteArray)
string hexString = BitConverter.ToString(byteArray);
hexString = hexString.Replace("-", "");
public static void Main(string[] args)
byte[] finalData = GenURL(3599689,"b29da881b5507b49e0d19957805d57ec",7,1);
Console.WriteLine("Final Data:");
foreach (var b in finalData)
Console.Write($"0x{b:x2} ");
Console.WriteLine(finalData.Length);
Console.WriteLine("AS COMBINED");
Console.WriteLine(ByteArrayToHexString(finalData));
Console.WriteLine("encrypting");
var encrypt = genAESCrypt(finalData,Encoding.UTF8.GetBytes("jo6aey6haid2Teih"));
Console.WriteLine(ByteArrayToHexString(encrypt));
foreach (var b in encrypt)
Console.Write($"0x{b:x2} ");
public static byte[] genAESCrypt(byte[] data, byte[] key)
using Aes myAes = Aes.Create();
myAes.Mode = CipherMode.ECB;
myAes.Padding = PaddingMode.None;
var encryptor = myAes.CreateEncryptor(myAes.Key, myAes.IV);
var encryptedBytes = encryptor.TransformFinalBlock(data, 0, data.Length);
public static byte[] GenURL(int trackID, string track_hash, int mediaver, int fmt)
byte[] md5originBytes = Encoding.UTF8.GetBytes(track_hash);
byte[] fmtBytes = Encoding.UTF8.GetBytes(fmt.ToString());
byte[] songidBytes = Encoding.UTF8.GetBytes(trackID.ToString());
byte[] mediaverBytes = Encoding.UTF8.GetBytes(mediaver.ToString());
byte[] a4Byte = { 0xa4 };
List<byte[]> concatbyteArrayList = new List<byte[]>
var data_concat = ArrayJoin(a4Byte[0],concatbyteArrayList);
List<byte[]> byteArrayList = new List<byte[]>
md5.ComputeHash(data_concat),
var data = ArrayJoin(a4Byte[0], byteArrayList);
byte[] append = new byte[data.Length + 1];
Buffer.BlockCopy(data, 0, append, 0, data.Length);
append[append.Length - 1] = a4Byte[0];
int length = append.Length;
int paddingNeeded = (blockSize - (length % blockSize)) % blockSize;
byte[] paddedData = new byte[length + paddingNeeded];
Buffer.BlockCopy(append, 0, paddedData, 0, length);
Console.WriteLine("md5originBytes: " + BitConverter.ToString(md5originBytes));
Console.WriteLine("fmtBytes: " + BitConverter.ToString(fmtBytes));
Console.WriteLine("songidBytes: " + BitConverter.ToString(songidBytes));
Console.WriteLine("mediaverBytes: " + BitConverter.ToString(mediaverBytes));
Console.WriteLine("data_concat: " + BitConverter.ToString(data_concat));
Console.WriteLine("md5Hash: " + BitConverter.ToString(md5.ComputeHash(data_concat)));
Console.WriteLine("data: " + BitConverter.ToString(data));
Console.WriteLine("append: " + BitConverter.ToString(append));
Console.WriteLine("paddedData: " + BitConverter.ToString(paddedData));
Console.WriteLine("Length: " + paddedData.Length);
public static byte[] ArrayJoin(byte separator, List<byte[]> arrays)
using (MemoryStream result = new MemoryStream())
byte[] first = arrays.First();
result.Write(first, 0, first.Length);
foreach (var array in arrays.Skip(1))
result.WriteByte(separator);
result.Write(array, 0, array.Length);