C #
Можливо, божевільний, круговий і заплутаний спосіб дістатися до (точного) результату - із лише змінними перейменами та без будь-якої буквальної «мами» в будь-якому коді.
Читання правила "якщо ви виймаєте блок коду з допису, ви приймаєте все", дуже буквально, мабуть, не допомогло - але зробило це веселішим.
using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
public class Program
{
void Main()
{
// Step 1
var n = 3;
var helloAndGoodbye = "12345678900"
.Select((c, i) => new { letter = c, group = i / n })
.GroupBy(l => l.group, l => l.letter)
.Select(g => string.Join("", g))
.ToList();
// Step 2
string place = "world";
string greet = String.Format("Hello {0}!", place);
// Step 3
byte[] b1 = System.Text.Encoding.UTF8.GetBytes (greet);
byte[] b2 = System.Text.Encoding.ASCII.GetBytes (greet);
// Step 4
string encryptionKey = "test";
var md5 = MD5.Create();
var keyBytes = Encoding.UTF8.GetBytes(encryptionKey);
byte[] encryptionKeyBytes = md5.ComputeHash(keyBytes);
// Step 5
string strName = md5.GetType().Name;
if(strName == "Person")
{
//My Code
}
// Step 6
string HashAlgorithm = new string(strName.Take(n).ToArray());
// Step 7
int previousYear = DateTime.Now.AddYears(-1).Year;
// Step 8
string myString = previousYear.ToString();
// Step 9
string totallyRandomString = new string(myString.Take(n).ToArray());
// Step 10
int myInt = System.Convert.ToInt32(totallyRandomString);
// Step 11
int x = myInt << 1 + 1;
// Step 12
PasswordDeriveBytes DerivedPassword =
new PasswordDeriveBytes(place, b1, HashAlgorithm, x);
byte[] KeyBytes = DerivedPassword.GetBytes(32);
// Step 13
string base64 = Convert.ToBase64String(KeyBytes);
byte[] bytes = Convert.FromBase64String(base64);
// Step 14
var split = base64.Split('/');
var last = split[split.Length -1];
var prev = split[split.Length -2];
// Step 15
string truncatedToNLength = new string(last.Take(n).ToArray());
// Step 16
Regex rgx = new Regex("[^a-zA-Z0-9 -]");
greet = rgx.Replace(greet, "");
// Step 17
var newString = greet.Replace(place.ToString(), truncatedToNLength);
// Step 18
var searchStr = newString.ToLower();
searchStr = searchStr.Trim();
// Step 19
Console.WriteLine(searchStr);
}
}
.NET Fiddle
http://dotnetfiddle.net/PbjhPn
http://dotnetfiddle.net/bg20wb (із зайвими рядками в кодових блоках видалено)
Коротке пояснення
В основному, ми отримуємо "Привіт, світ!" від простого струнного формату. Тепер нам потрібна "мама", щоб замінити її. Для цього ми використовуємо кодований Base64 результат виконання 804 ітерацій PBKDF1 з використанням MD5 зі "world" як паролем та "Hello world!" як сіль. Це дає рядок "ciSf5cCls1l / MoM ...". Ми витягуємо цей "MoM" і використовуємо його як заміну на "world". Потім зачищаємо рядок.
Як нам дістатися до 804? Попередній рік обрізали на три символи (= "201"), а потім множили на 4.
Довгі пояснення та приписи
1: Почнемо з трохи перевиконання правил. Ціле число 3 - дуже важлива константа в цій програмі. Тут ми призначимо це ціле число n
. Ми повинні включити весь блок із джерела. Це може бути зайвим, але воно складеться чудово, доки ми перейменовуємо split
змінну, яка нам знадобиться пізніше. Джерело
Замінені імена змінних:
split > helloAndGoodbye
2: Встановіть початковий рядок ("Привіт, світ!"). Джерело
Це дуже особисте повідомлення нашої мами. Тому нам, очевидно, потрібна криптовалюта, щоб мати справу з цими типами АНБ. Для цього нам знадобляться деякі параметри, які ми зараз готуємо.
3: Перетворити greet
("Hello world!") В байтовий масив для засолювання. Джерело
myString > greet
4: Хоча ми використовуємо криптографію, нам насправді не потрібно інстанціювати клас MD5. Однак нам потрібна рядок "MD5", призначений для подальшого використання одного з наших параметрів, - і це не просто знайти у використаному коді. Тож ми візьмемо ще один "ярлик" ... Ще раз, весь код коду включений відповідно до правил, хоча нам потрібен лише другий рядок. Джерело
5: Тепер нам знадобиться назва типу md5
змінної ( MD5CryptoServiceProvider
). Це if
ще одне надмірність. Джерело
entity > md5
6: Отримайте перші 3 (ooh, є наші постійні!) Символи назви типу. Джерело
s > strName
truncatedToNLength > HashAlgorithm
7: Тролінг коду: Використання DateTime.Now
означатиме, що це буде працювати лише до 2019 року. Щоб зробити це ще більш надійним доказом, ми використовуємо попередній рік. Тоді вона працюватиме до 2020 року ;-) Джерело
8: Перетворимо наш previousYear
у рядок. Джерело
myInt > previousYear
9: Гей, повторне використання коду! ;-) Отримайте перші 3 (наші постійні!) Символи нашого року. Джерело
s > myString
truncatedToNLength > totallyRandomString
10: Ааааааа ... перетворити результат назад у ціле число. Джерело
myString > totallyRandomString
11: Ерік Ліпперт робить кожну відповідь кращою. Помножте на 4 круговим способом. Джерело
y > myInt
12: Надіслати place
(пароль) та greet
(сіль) через PBKDF1 за допомогою MD5 з x
(що зараз 201*4 = 804
) ітераціями. Джерело
Password > place
SaltValueBytes > b1
PasswordIterations > x
13: Джон Скіт також робить кожну відповідь кращою. Перетворимо наш похідний пароль в базу 64. Ми викидаємо bytes
масив. Джерело
bytes (first occurrence) > KeyBytes
14: Який шалений випадковий випадок! Тепер у нас є base64
"MoM". Зручно, безпосередньо перед "MoM" є сингл "/". Тож розділіть рядок із цим символом як роздільник: Джерело
filePath > base64
15: Ей, наша улюблена стрічка повторного використання коду! Отримайте перші 3 (постійні!) Літери last
. Джерело
s > last
16: Видаліть "!". Джерело
str > greet
17: MoM - це наш світ - тому зробіть рядок відображенням цього (замініть "world" на "MoM"). Джерело
someTestString > greet
someID > place
sessionID > truncatedToNLength
18: Нарешті, переведіть на малі регістри. Оздоблення для гарної міри (або, можливо, тому, що це частина блоку канальних стрічок). Джерело
wordToSearchReplacemntsFor > newString
19: Вихід на консоль. Джерело
_surface > searchStr
Трохи "бонусного матеріалу" / коментар
Спочатку я спробував кожну комбінацію вбудованих криптографічних хешей (кожен поєднаний з HMAC) та вхідними даними ("world", "Hello world!", "Hello world", "hello world" тощо), щоб побачити, чи щось чудом дасть корисний вихід для отримання «мами» від - перед тим, як скористатися простим маршрутом, просто шукаючи ряд ітерацій PDKDB1 (або 2), які були б корисні.
Був не зовсім задоволений використанням року в якості вхідного сигналу для ітерацій 201 * 4 = 804. Спочатку я спробував знайти якийсь корисний код для HttpStatusCode.Created
(201), який би використовувався в якості вхідного сигналу - з "виправданням троля", відповідно до пункту "ми створили наш" Привіт світ! " рядок, тому гарною практикою буде використання тут "Створеного" коду статусу ". На жаль, я ніколи не знайшов використання HttpStatusCode
перерахунку, який не ввів залежності від більшості фреймворків ASP.NET WebAPI.
Початок коду (формат рядка "Привіт, світ!") Ніколи не переглядався знову після того, як я вперше додав його. Якби я, так, я, можливо, зрозумів би, що призначення place
було насправді в іншому блоці в джерелі, - тому я міг просто призначити свою похідну "маму", place
а не використовувати "світ" і пізніше замінити її. Ну добре.