씨#
변수 이름 만 바꾸고 코드에 문자 그대로 "엄마"가없는 (정확한) 결과를 얻는 미친, 원형 교차로 및 복잡한 방법.
"포스트에서 코드 블록을 가져 가면 모든 것을 가져 간다"라는 규칙을 말 그대로 도움이되지는 않았지만 더 재미있게 만들었습니다.
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 인코딩 결과를 사용합니다. 소금으로. 그러면 문자열 "ciSf5cCls1l / 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 : 보내기 place
(암호)와 greet
와 MD5 사용 PBKDF1을 통해 (소금) x
(지금 201*4 = 804
반복). 출처
Password > place
SaltValueBytes > b1
PasswordIterations > x
13 : Jon Skeet도 모든 답변을 개선합니다. 파생 된 암호를 기본 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)이 입력으로 사용할 유용한 코드를 찾으려고 노력했습니다. "우리는 'Hello world!'를 만들었습니다. 문자열을 사용하는 것이 좋습니다. 여기에서 '생성 된'상태 코드를 사용하는 것이 좋습니다. " 불행히도, 나는HttpStatusCode
대부분의 ASP.NET WebAPI 프레임 워크에 의존하지 않는 열거 형 을 찾지 못했습니다.
코드의 시작 ( "Hello world!"문자열 형식)은 처음 추가 한 후에는 다시 보지 않았습니다. 만약 그렇다면, 할당이 place
소스에서 실제로 다른 블록에 있다는 것을 깨달았을 것입니다. 따라서 place
"world"를 사용하지 않고 나중에 파생 된 "mom"을 단순히 할당 하고 나중에 교체 할 수있었습니다. 아 잘