सी#
संभवतः (सटीक) परिणाम प्राप्त करने के लिए संभवतः पागल, गोल, और दृढ़ तरीका है - किसी भी कोड में केवल चर नाम और बिना शाब्दिक "माँ" के साथ।
"यदि आप एक पोस्ट से एक कोड ब्लॉक लेते हैं, तो आप पूरी बात लेते हैं" नियम बहुत शाब्दिक रूप से मदद नहीं करता है - लेकिन इसे और अधिक मजेदार बना दिया।
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 (हटाए गए कोड ब्लॉक में अनावश्यक लाइनों के साथ)
संक्षिप्त व्याख्या
असल में, हमें "हैलो वर्ल्ड!" एक साधारण स्ट्रिंग प्रारूप से। अब हमें इसे बदलने के लिए "माँ" की आवश्यकता है। उसके लिए, हम MD5 का उपयोग करते हुए "दुनिया" के साथ पासवर्ड और "हैलो वर्ल्ड!" के साथ PBKDF1 के 804 पुनरावृत्तियों को चलाने के Base64 एन्कोडेड परिणाम का उपयोग करते हैं। नमक के रूप में। यह एक स्ट्रिंग "ciSf5cCls1l / MoM ..." पैदा करता है। हम उस "एमओएम" को निकालते हैं और इसे "दुनिया" के प्रतिस्थापन के रूप में उपयोग करते हैं। फिर हम स्ट्रिंग को साफ करते हैं।
हम 804 कैसे प्राप्त करते हैं? पिछला वर्ष तीन वर्णों (= "201") तक पहुंच गया, और फिर 4 से गुणा किया गया।
लंबी व्याख्या और विशेषता
1: हम कुछ नियम-पालन ओवरकिल के साथ शुरू करते हैं। पूर्णांक 3 इस कार्यक्रम में एक बहुत ही महत्वपूर्ण स्थिरांक है। यहाँ हम उस पूर्णांक को असाइन करते हैं n
। हमें स्रोत से पूरे ब्लॉक को शामिल करना चाहिए। यह निरर्थक हो सकता है, लेकिन यह ठीक ठीक संकलन करेगा, जब तक हम उस split
चर का नाम बदल देते हैं जिसकी हमें बाद में आवश्यकता होगी। स्रोत
बदला हुआ चर नाम:
split > helloAndGoodbye
2: स्टार्टिंग स्ट्रिंग सेट करें ("हैलो वर्ल्ड!")। स्रोत
यह हमारी माँ के लिए एक बहुत ही व्यक्तिगत संदेश है। तो हमें स्पष्ट रूप से उन एनएसए प्रकारों से निपटने के लिए कुछ क्रिप्टोग्राफी की आवश्यकता है। उसके लिए, हमें कुछ मापदंडों की आवश्यकता होगी, जिन्हें हम अभी तैयार करते हैं।
3: कन्वर्ट greet
("नमस्ते दुनिया!") नमकीन के लिए बाइट सरणी के लिए। स्रोत
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: एरिक लिपर्ट हर उत्तर को बेहतर बनाता है। गोल चक्कर में 4 से गुणा करें। स्रोत
y > myInt
12: PBKDF1 के माध्यम से भेजें place
(पासवर्ड) और greet
(नमक) 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 हमारी दुनिया है - इसलिए स्ट्रिंग को प्रतिबिंबित करें ("MoM" के साथ "दुनिया" बदलें)। स्रोत
someTestString > greet
someID > place
sessionID > truncatedToNLength
18: अंत में, लोअर केस में कनवर्ट करें। अच्छे उपाय के लिए ट्रिम करें (या संभवतः क्योंकि यह डक्ट टेप ब्लॉक का हिस्सा है)। स्रोत
wordToSearchReplacemntsFor > newString
19: कंसोल को आउटपुट। स्रोत
_surface > searchStr
"बोनस सामग्री" / टिप्पणी का एक सा
सबसे पहले मैंने अंतर्निहित क्रिप्टोग्राफिक हैश (प्रत्येक एचएमएसी के साथ संयुक्त) और इनपुट्स ("दुनिया", "हैलो वर्ल्ड!", "हैलो वर्ल्ड", "हैलो वर्ल्ड" आदि) के प्रत्येक संयोजन को देखने की कोशिश की कि क्या कुछ चमत्कारिक रूप से देगा? "माँ" को प्राप्त करने के लिए एक प्रयोग करने योग्य आउटपुट - पीडीकेडीबी 1 (या 2) के पुनरावृत्तियों की संख्या की तलाश में आसान मार्ग लेने से पहले जो उपयोगी होगा।
201 * 4 = 804 पुनरावृत्तियों के लिए इनपुट के रूप में वर्ष के उपयोग से बिल्कुल खुश नहीं थे। सबसे पहले मैंने HttpStatusCode.Created
इनपुट के रूप में उपयोग करने के लिए (201) के लिए कुछ उपयोगी कोड खोजने की कोशिश की - "हमने अपनी 'हैलो वर्ल्ड!' स्ट्रिंग, इसलिए एक अच्छा अभ्यास यहां 'क्रिएटेड स्टेटस कोड' का उपयोग करना होगा। दुर्भाग्य से, मैंने कभी भी उस HttpStatusCode
एन्यूमरेशन का उपयोग नहीं किया जो ASP.NET वेबएपीआई के अधिकांश ढांचे पर निर्भरता का परिचय नहीं देता था।
कोड की शुरुआत ("हैलो दुनिया!" स्ट्रिंग प्रारूप) के बाद मैं इसे पहली बार जोड़ने के बाद फिर से कभी नहीं देखा गया था। अगर मेरे पास था, तो, मुझे महसूस हो सकता था कि असाइनमेंट place
वास्तव में स्रोत के एक अलग ब्लॉक में था - इसलिए मैं अपनी व्युत्पन्न "माँ" को place
"दुनिया" का उपयोग करने के बजाय सौंपा जा सकता था और बाद में इसे बदल सकता था। ठीक है।