using System; using System.Security.Cryptography; using System.Text; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; namespace nboard { class Program { static void Main() { var roothash = HashCalculator.Calculate(new string('0',32)+"{Welcome to Nanoboard}"); byte[] bytes = NanoEncoding.GetBytes(roothash+@"Свидетельство на товарный знак выдаётся в РФ сроком на 10 лет. В дальнейшем оно может быть по соответствующему заявлению в регистрирующий орган и уплаты соответствующей государственной пошлины продлено ещё на 10 лет, и так неограниченное число раз[18]. Чтобы товарный знак приобрел известность и признание, требуются значительные капиталовложения и, обычно, значительный период времени. Поэтому в интересах каждого, кто стремится использовать товарный знак, быть уверенным, что ему предоставляется охрана как ценному объекту интеллектуальной собственности. Это зависит от законов о товарных знаках, однако наиболее общепринятым способом охраны товарного знака является его регистрация в Реестре товарных знаков, и большое число стран ставит эту регистрацию условием охраны товарных знаков. Сначала знак должен быть зарегистрирован, и как только он зарегистрирован, он охраняется, и его владелец имеет право воспрепятствовать другим лицам в его использовании. Однако регистрация не является единственным способом охраны товарного знака. В некоторых странах также охраняются незарегистрированные товарные знаки, однако это менее надёжная форма охраны, поскольку незарегистрированный товарный знак не защищен до тех пор, пока он не приобрел достаточную узнаваемость и репутацию на рынке, на что может уйти значительное время после первоначального выпуска на рынок. Если вы начинаете предлагать на рынке ваши продукты под новым товарным знаком, о котором никто не знает, этот товарный знак будет очень уязвимым. Можно претендовать на охрану, предоставляемую законами о недобросовестной конкуренции, однако в этом случае наиболее важным моментом является то, что знак должен приобрести репутацию."); Console.WriteLine(Convert.ToBase64String(bytes)); } } static class NanoEncoding { static string charset = "?!\"#$%&'()*+,-./0123456789:;<=> @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"+ "ЎўЄєІіЇїАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюяčšžćśźńŭłČŠŽĆŚŽŽŬŁ" + "№©«»±®Ґґ°™—“”’‘…–\n\r\t"; public static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length]; int i = 0; foreach (var c in str) { int iof = charset.IndexOf(c); if (iof == -1) bytes[i++] = 0; else bytes[i++] = (byte)iof; } return bytes; } public static string GetString(byte[] bytes) { char[] chars = new char[bytes.Length]; int i = 0; foreach (var b in bytes) { if (b > charset.Length) chars[i++] = '?'; else chars[i++] = charset[b]; } return new string(chars); } } static class HashCalculator { public const int HashCrop = 16; public static string Calculate(string raw) { byte[] bhash = MD5.Create().ComputeHash(NanoEncoding.GetBytes(raw)); StringBuilder sb = new StringBuilder(); for (int i = 0; i < HashCrop; i++) { sb.Append(bhash[i].ToString("x2")); } return sb.ToString(); } } }