C#
可能是疯狂,round回和复杂的方式来获得(精确的)结果-仅使用变量重命名,并且在任何代码中都没有任何文字“ mom”。
阅读“如果您从帖子中获取代码块,那么就把整个事情都做完了”的规则,从字面上看可能无济于事,但使它变得更加有趣。
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小提琴
http://dotnetfiddle.net/PbjhPn
http://dotnetfiddle.net/bg20wb(删除了代码块中的多余行)
简短说明
基本上,我们得到“ Hello world!” 从简单的字符串格式。现在我们需要“妈妈”来代替它。为此,我们使用通过MD5(具有“ world”作为密码和“ Hello world!”)运行PBKDF1的804次迭代的Base64编码结果。作为盐。产生一个字符串“ ciSf5cCls11 / MoM ...”。我们提取该“ MoM”并将其用作“ world”的替代。然后我们清理字符串。
如何到达804?前一年剪裁为三个字符(=“ 201”),然后乘以4。
详细说明和归因
1:我们从一些遵循规则的过大杀手开始。整数3是此程序中非常重要的常数。在这里,我们将该整数分配给n
。我们必须从源头包括整个块。它可能是多余的,但是只要我们重命名split
以后将需要的变量,它就可以很好地编译。资源
替换的变量名称:
split > helloAndGoodbye
2:设置起始字符串(“ Hello world!”)。资源
这是给我们妈妈的非常私人的信息。因此,我们显然需要一些加密技术来处理那些NSA类型。为此,我们需要一些我们现在准备的参数。
3:将greet
(“ Hello world!”)转换为字节数组以加盐。资源
myString > greet
4:尽管我们使用的是加密技术,但实际上并不需要实例化MD5类。但是,我们确实需要为我们的参数之一分配字符串“ MD5”才能在以后使用-这在可用代码中很难找到。因此,我们将采用另一个“快捷方式” ...再次,按照规则包括了整个代码块,尽管我们只需要第二行。资源
5:现在我们需要md5
变量类型的名称(MD5CryptoServiceProvider
)。这if
是另一个冗余。资源
entity > md5
6:获取类型名称的前3个(哦,这是我们的常量!)字符。资源
s > strName
truncatedToNLength > HashAlgorithm
7:代码拖曳:使用DateTime.Now
将意味着这将一直持续到2019年。为了使它更适合将来,我们使用了上一年。然后它将工作到2020年;-) 来源
8:将我们转换previousYear
为字符串。资源
myInt > previousYear
9:嘿,代码重用!;-)获取今年的前3个(我们的常数!)字符。资源
s > myString
truncatedToNLength > totallyRandomString
10: Aaaaaaaand ...将结果转换回整数。资源
myString > totallyRandomString
11:埃里克·利珀特(Eric Lippert)使每个答案都更好。以回旋方式乘以4。资源
y > myInt
12:使用MD5 (现在是迭代)通过PBKDF1 发送place
(密码)和greet
(盐)。资源x
201*4 = 804
Password > place
SaltValueBytes > b1
PasswordIterations > x
13:乔恩·斯基特(Jon Skeet)也使每个答案都更好。将派生的密码转换为以64为基数。我们丢弃该bytes
数组。资源
bytes (first occurrence) > KeyBytes
14:多么疯狂的随机事件!现在,我们有了一个base64
带有“ MoM”的标记。方便地,就在“ MoM”之前是单个“ /”。因此,以该字符作为分隔符分割字符串:Source
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结合)和输入(“世界”,“你好世界!”,“你好世界”,“你好世界”等)的每种组合,以查看是否会奇迹般地给出一个有用的输出,用于从中推导“妈妈”,然后采取简单的方法,即寻找许多有用的PDKDB1(或2)迭代。
使用年份作为201 * 4 = 804迭代的输入并不十分满意。最初,我试图找到一些有用的代码供HttpStatusCode.Created
(201)用作输入-带有“巨魔借口”,类似“我们已经创建了'Hello world!'。字符串,因此一种好的做法是在此处使用“已创建”状态代码”。不幸的是,我从来没有发现HttpStatusCode
枚举的用法没有引入对大多数ASP.NET WebAPI框架的依赖。
在我第一次添加代码后,就再也没有看过代码的开头(“ Hello world!”字符串格式)。是的,如果我有的话,我可能已经意识到的分配place
实际上是在源代码的另一个块中-因此我可以简单地将派生的“妈妈”分配给place
而不是使用“世界”,然后再替换它。呃,好吧。