আন্ডারহ্যান্ডেড পাসওয়ার্ড হ্যাশিং [বন্ধ]


33

আন্ডারহ্যান্ডেড সি প্রতিযোগিতার চেতনায় আমি আন্ডারহ্যান্ডেড কোড প্রতিযোগিতা শুরু করছি। এই প্রতিযোগিতার উদ্দেশ্যটি হ'ল কিছু কোড সোজাসুজি প্রয়োগ করা, যখন এর ভিতরে একটি ঘৃণ্য বাগ লুকিয়ে রাখা হয় ly

প্রতিযোগীতা

আপনি আমেরিকান গুপ্তচর সংস্থার আইটি বিভাগে কর্মরত একটি গোপন রাশিয়ান তিল। আপনার আমেরিকান বস সবেমাত্র গোপন বার্তা এনক্রিপ্ট করার জন্য আপনাকে একটি পাসওয়ার্ড হ্যাশিং অ্যালগরিদম প্রয়োগ করতে বলেছে।

আপনার বস আপনাকে নিম্নলিখিত ফাংশনটি প্রয়োগ করতে চান:

f: String -> byte[16]

যা কোনও পাসওয়ার্ডকে একটি এএস কী হিসাবে ব্যবহারের জন্য উপযুক্ত 16-বাইট পরিমাণে রূপান্তর করে। আপনার বস একটি সুরক্ষিত ফাংশন চান, যার প্রসঙ্গে এই অর্থ হল যে বিভিন্ন পাসওয়ার্ড স্ট্রিং অপ্রতিরোধ্য সম্ভাবনার সাথে বিভিন্ন ফলাফল উত্পন্ন করতে পারে। উদাহরণস্বরূপ, ইনপুটটির এমডি 5 হ্যাশ ফিরিয়ে দেওয়া একটি সাধারণ বাস্তবায়ন হবে f

অবশ্যই, রাশিয়ান গুপ্তচর সংস্থায় আপনার আসল বস আপনাকে এই প্রক্রিয়াটি নষ্ট করতে চাইবে। আপনার কাজটি এমন বাস্তবায়ন করা fযা রাশিয়ানরা ফিরে আসা কীগুলি ব্যবহার করে এনক্রিপ্ট করা সমস্ত গোপন বার্তা ডিক্রিপ্ট করতে পারে f

এটি করতে, আপনাকে অবশ্যই প্রয়োগ করতে হবে fযাতে এটি কেবলমাত্র 2 ^ 128 এর সম্ভাব্য আউটপুটগুলির একটি ছোট উপসেটটি দেয়। বিশেষত, আপনার fঅবশ্যই সর্বোচ্চ 2 ^ 16 টি ভিন্ন ফলাফলের দিকে ফিরে আসতে হবে যাতে রাশিয়ানরা তাদের ডিক্রিপ্ট করতে ইচ্ছুক প্রতিটি এনক্রিপ্ট করা বার্তাটির সঠিক কীটির জন্য একটি সহজ ব্রুট-ফোর্স অনুসন্ধান করতে পারে।

তবে মনে রাখবেন যে গুপ্তচরবৃত্তি মৃত্যুদণ্ড বহন করে। যাতে ধরা না পড়ার জন্য, আপনার ফাংশনটিতে fকমপক্ষে 2 ^ 8 টি ভিন্ন ফলাফল উত্পন্ন করা উচিত, যাতে কয়েকটি আউটপুটের কার্সারি পরীক্ষা fকরে কোনও সদৃশ প্রকাশের সম্ভাবনা থাকে। এবং সর্বাপেক্ষা গুরুত্বপূর্ণ, আপনি যে কোডটির পরিসীমা সীমাবদ্ধ করতে প্রবর্তন করেছেন তা fঅবশ্যই ইচ্ছাকৃত নয় tention আপনি যদি কখনও আদালতের ঘরে intoুকে পড়ে থাকেন তবে আপনারা ইচ্ছাকৃতভাবে বা দুর্ঘটনাক্রমে বাগটি প্রবর্তন করেছেন কিনা সে সম্পর্কে কিছুটা যুক্তিসঙ্গত সন্দেহ থাকতে হবে।

বিচার করা

আমি এবং অন্য দু'জনকে আমি নিয়োগ দিই এন্ট্রিগুলি বিচার করব (যদি আপনি বিচার করতে চান তবে আমাকে ইমেল করুন)। আমি বিজয়ী প্রবেশের জন্য 200 খ্যাতি অনুদান দিচ্ছি সাবমিশনগুলি মে মাসের মধ্যে আপলোড করতে হবে।

বিচার করা নিম্নলিখিত মানদণ্ডগুলিতে বিবেচনা করবে:

  • অনুমানকে fমেনে চলে না, অর্থাত্ এটি 2 ^ 8 থেকে 2 ^ 16 সম্ভাব্য আউটপুটগুলির মধ্যে উত্পন্ন করে। এগুলি কঠোর সীমাবদ্ধ বলে মনে করবেন না, তবে আপনি খুব বেশি সীমা ছাড়িয়ে গেলে আমরা পয়েন্টগুলি কেটে নেব।
  • বাগটি সম্ভবত নির্বিচারে ভুলের ফল?
  • আউটপুটগুলি fএলোমেলো দেখায়?
  • আপনার প্রয়োগ যত কম fহবে তত ভাল।
  • আপনার বাস্তবায়ন যত পরিষ্কার fহবে তত ভাল।

নোট

আপনি আপনার কোড প্রয়োগ করতে যে কোনও ভাষা ব্যবহার করতে পারেন। আপনি সরল দৃষ্টিতে একটি বাগটি আড়াল করার চেষ্টা করছেন, সুতরাং অবলম্বন কোডটি প্রস্তাবিত নয়।

আপনি যা কিছু ভাল জমা দেয় তার জন্য অনুভূতি পেতে পূর্ববর্তী আন্ডারহ্যান্ডেড সি প্রতিযোগিতার বিজয়ীদের কিছুটা একবার দেখে নিতে পারেন ।

ইনপুট স্ট্রিংগুলি মুদ্রণযোগ্য আসকি (32 থেকে 126, সমেত) হবে be আপনি চাইলে যুক্তিসঙ্গত সর্বোচ্চ দৈর্ঘ্য ধরে নিতে পারেন।


1
ইনপুট স্ট্রিংয়ের কোনও সীমাবদ্ধতা আছে? যেমন এটি কেবল বর্ণমালা নিয়ে গঠিত?
Ali1S232

@ গেজেট: আপনাকে অবশ্যই মুদ্রণযোগ্য আসকি অক্ষরগুলির সবগুলি পরিচালনা করতে হবে (326 126, সমেত)।
কিথ র্যান্ডাল

আউটপুট পরিসীমাটি কি সমস্ত 16-বাইট স্ট্রিং, বা কেবল মুদ্রণযোগ্য?
বুথবি

@ বুথবি: সমস্ত সম্ভাব্য 16-বাইট মান (2 ^ 128 সম্ভাবনা)
কীথ র্যান্ডাল

1
আমি এই প্রশ্নটিকে অফ-টপিক হিসাবে বন্ধ করতে ভোট দিচ্ছি কারণ ছদ্মবেশী চ্যালেঞ্জগুলি এখন আর এই সাইটে অন টপিক নয়। meta.codegolf.stackexchange.com/a/8326/20469
বিড়াল

উত্তর:


15

সি

2 ^ 16 সম্ভাব্য আউটপুট (বা ব্যবহৃত অক্ষরের সংখ্যার 2 ^ 8 গুণ)।
লিনাক্সের MD5 বাস্তবায়ন ব্যবহার করে, যা আফাইক, ঠিক আছে। তবে এটি একই হ্যাশ দেয়, উদাহরণস্বরূপ, "40" এবং "42" এর জন্য।
সম্পাদনা: এটিকে পুনরায় নামকরণ করা bcopyহয়েছে memcpy(অবশ্যই অদলবদল পরামিতি)।
সম্পাদনা: প্রয়োজনীয়তা আরও ভালভাবে মেটানোর জন্য প্রোগ্রাম থেকে ক্রিয়াকলাপে রূপান্তরিত।

#include <string.h>
#include <openssl/md5.h>

void f(const unsigned char *input, unsigned char output[16]) {

    /* Put the input in a 32-byte buffer, padded with zeros. */
    unsigned char workbuf[32] = {0};
    strncpy(workbuf, input, sizeof(workbuf));

    unsigned char res[MD5_DIGEST_LENGTH];
    MD5(workbuf, sizeof(workbuf), res);

    /* NOTE: MD5 has known weaknesses, so using it isn't 100% secure.
     * To compensate, prefix the input buffer with its own MD5, and hash again. */
    memcpy(workbuf+1, workbuf, sizeof(workbuf)-1);
    workbuf[0] = res[0];
    MD5(workbuf, sizeof(workbuf), res);

    /* Copy the result to the output buffer */
    memcpy(output, res, 16);
}

/* Some operating systems don't have memcpy(), so include a simple implementation */
void *
memcpy(void *_dest, const void *_src, size_t n)
{
    const unsigned char *src = _src;
    unsigned char *dest = _dest;
    while (n--) *dest++ = *src++;
    return _dest;
}

এটি এমডি 5 এর সাথে কোনও ত্রুটি?
Ali1S232

@ গেজেট, না, আমি লিনাক্সের এমডি 5 ব্যবহার করেছি, যা পুরোপুরি ঠিক আছে (এএফাইক)।
ugoren

তারা কেন এটি আরও সম্ভাব্য আউটপুট তৈরি করে না?
Ali1S232

1
@ গেজেট: bcopyপদক্ষেপে কী ঘটে যায় তা বিবেচনা করুন ... এটি ভুল দিকনির্দেশনার একটি দুর্দান্ত বিষয়, যেহেতু আসল বিএসডি bcopyফাংশনটি এখানে সঠিকভাবে কাজ করবে।
এএন

@ হ্যাঁ, আসলে, আমি এখন দেখছি যে আমার bcopyবগি। আমি এটিকে পরিবর্তন করব memcpyএবং তারপরে একই প্রয়োগ কার্যকর হবে।
উগোরেন

13

সি

এটি সম্ভবত সবচেয়ে সহজ প্রতিযোগিতার এন্ট্রি নাও হতে পারে তবে আমি মনে করি যে হ্যাশ ফাংশনগুলিতে আপনি যে ধরণের ক্রিয়াকলাপ দেখছেন তার কোনও অস্পষ্ট ধারণা সহ কোনও হস্তক্ষেপকারী নিজের গুণের জন্য খুব চালাক দ্বারা তৈরি করা যেত এমন হ্যাশ ফাংশনটি হ'ল:

#include <stdio.h>
#include <string.h>
#include <stdint.h>

void hash(const char* s, uint8_t* r, size_t n)
{
     uint32_t h = 123456789UL;
     for (size_t i = 0; i < n; i++) {
          for (const char* p = s; *p; p++) {
               h = h * 33 + *p;
          }
          *r++ = (h >> 3) & 0xff;
          h = h ^ 987654321UL;
     }
}

int main()
{
     size_t n = 1024;
     char s[n];
     size_t m = 16;
     uint8_t b[m];
     while (fgets(s, n, stdin)) {
          hash(s, b, m);
          for (size_t i = 0; i < m; ++i)
               printf("%02x", b[i]);
          printf("\n");
     }
}

প্রকৃতপক্ষে হ্যাশ ফাংশনটি এল * 2048 ভিন্ন ফলাফলের চেয়ে বেশি আর ফিরে আসতে পারে না, যেখানে এল হতে পারে বিভিন্ন ইনপুট স্ট্রিং দৈর্ঘ্যের সংখ্যা। অনুশীলনে, আমি আমার ল্যাপটপে ম্যানুয়াল পৃষ্ঠাগুলি এবং এইচটিএমএল ডকুমেন্টগুলি থেকে 1.85 মিলিয়ন ইউনিক ইনপুট লাইনগুলিতে কোডটি পরীক্ষা করেছিলাম এবং কেবল 85428 টি আলাদা আলাদা অনন্য হ্যাশ পেয়েছি।


0

scala:

// smaller values for more easy tests:
val len = 16
// make a 16 bytes fingerprint
def to16Bytes (l: BigInt, pos: Int=len) : List[Byte] = 
  if (pos == 1) List (l.toByte) else (l % 256L).toByte :: to16Bytes (l / 256L, pos-1)
/** if number isn't prime, take next */
def nextProbPrime (l: BigInt) : BigInt = 
  if (l.isProbablePrime (9)) l else nextProbPrime (l + 1)
/** Take every input, shift and add, but take primes */
def codify (s: String): BigInt = 
  (BigInt (17) /: s) ((a, b) => nextProbPrime (a * BigInt (257) + b))
/** very, very short Strings - less than 14 bytes - have to be filled, to obscure them a bit: */
def f (s: String) : Array [Byte] = {
  val filled = (if (s.size < 14) s + "secret" + s else s)
  to16Bytes (codify (filled + filled.reverse)).toArray.map (l => nextProbPrime (l).toByte) 
}

পরীক্ষা, ফলাফল একই অনুরূপ ইনপুট জন্য অনুরূপ না দেখায় যদি:

val samples = List ("a", "aa", "b", "", "longer example", "This is a foolish, fishy test") 

samples.map (f) 

 List[Array[Byte]] = List(
Array (-41, -113, -79, 127, 29, 127, 31, 67, -19, 83, -73, -31, -101, -113, 97, -113), 
Array (-19, 7, -43, 89, -97, -113, 47, -53, -113, -127, -31, -113, -67, -23, 127, 127), 
Array (-41, -113, -79, 127, 29, 127, 31, 67, -19, 83, -73, -31, -101, -113, 97, -113), 
Array (37, -19, -7, 67, -83, 89, 59, -11, -23, -47, 97, 83, 19, 2, 2, 2), 
Array (79, 101, -47, -103, 47, -13, 29, -37, -83, -3, -37, 59, 127, 97, -43, -43), 
Array (37, 53, -43, -73, -67, 5, 11, -89, -37, -103, 107, 97, 37, -71, 59, 67))

ত্রুটিটি এনকোডিংয়ের জন্য কেবল প্রাইম ব্যবহার করছে। পরিবর্তে

scala> math.pow (256, 16)
res5: Double = 3.4028236692093846E38

মান, আমরা শেষ

scala> math.pow (54, 16)
res6: Double = 5.227573613485917E27

যেহেতু 256 এর নীচে 54 টি প্রাইম রয়েছে।


2
5.22e27 >> 2^16। জোর করে বলার উপায় নেই যে অনেক সম্ভাবনা।
কিথ র্যান্ডাল

আপনি ভাষার নামটি ভুলে
গিয়েছেন

@ অজ্যাক্স 333221: স্কালা। আমি এটি শীর্ষে যুক্ত করেছি।
ব্যবহারকারী অজানা

@ কিথরান্ডাল: আমি 'দুর্ঘটনাক্রমে' কেবলমাত্র পজিটিভ বাইট ব্যবহার করতে পারি, যা সম্ভাবনাগুলি গণিত.পো (27, 16) হ্রাস করবে, তবে এটি এখনও 8e22 এর মধ্যে রয়েছে।
ব্যবহারকারী অজানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.