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а не використовувати "світ" і пізніше замінити її. Ну добре.