ভাঙা সাইফারটি ভেঙে দিন


12

আমি একটি সাধারণ র্যান্ডম জেনারেটর ডিজাইন করেছি যা একটি গুণ এবং মডুলাস পদ্ধতিটি ব্যবহার করে বিশৃঙ্খলাবদ্ধভাবে দুটি সংখ্যা চক্র করে। এটি তার জন্য দুর্দান্ত কাজ করে।

যদি আমি এটি সাইফার জেনারেটর হিসাবে ব্যবহার করি তবে এটি একটি পরিচিত প্লেটেক্সট আক্রমণের পক্ষে ঝুঁকিপূর্ণ হবে, এই বিষয়টি প্রদত্ত যে কোনও আক্রমণকারী একটি গণনাগত দক্ষতার সাথে এলোমেলো সংখ্যার সিরিজ থেকে ইঞ্জিনিয়ারকে বিপরীত করতে পারে।

সাইফারকে ভাঙ্গা প্রমাণ করার জন্য একটি বীজ মানগুলির একটি আইনি যুগল সন্ধান করুন যা সম্ভব হিসাবে সামান্য শক্তি, সিপিইউ-টাইম ইত্যাদি ব্যবহার করে একটি সারিতে [0; 255] এর মধ্যে 7 জিরো উত্পন্ন করে rate

এখানে জাভাস্ক্রিপ্টে র্যান্ডম জেনারেটর লেখা রয়েছে:

function seed(state1,state2){
    //Constants
    var mod1=4294967087
    var mul1=65539
    var mod2=4294965887
    var mul2=65537
    function random(limit){
        //Cycle each state variable 1 step
        state1=(state1*mul1)%mod1
        state2=(state2*mul2)%mod2
        //Return a random variable
        return (state1+state2)%limit
    }
    //Return the random function
    return random
}

//Initiate the random generator using 2 integer values,
//they must be in the ranges [1;4294967086] and [1;4294965886]
random=seed(31337,42)
//Write 7 random values in the range [0;255] to screen
for(a=0;a<7;a++){
    document.write(random(256)+"<br>")
}

আমি প্রার্থী নম্বর জোড় পরীক্ষা করার জন্য একটি সরঞ্জাম তৈরি করেছি, এটি এখানে পাওয়া যাবে

পরের 3 দিনের জন্য, কোনও স্পয়লার অনুমতি দেওয়া হয়নি , একটি উত্তরে অবশ্যই সংখ্যার একটি সেট থাকতে হবে এবং এটি অবশ্যই পূর্ববর্তী সমাধানকারীদের দ্বারা পোস্ট করা লোকদের থেকে আলাদা সেট হওয়া উচিত। এরপরে আপনাকে কোড পোস্ট করতে এবং আপনার পদ্ধতির ব্যাখ্যা দিতে উত্সাহ দেওয়া হবে।

সম্পাদনা করুন, পৃথক পৃথক কাজ:
উত্তরগুলি সমাধানের পদ্ধতির নথী করার জন্য সংখ্যার একটি অনন্য সেট এবং ব্যাখ্যা এবং কোড উভয়ই থাকা উচিত।

সর্বাধিক মার্জিত সমাধান জয়।

রেকর্ডের জন্য:
দ্রুত কোনও সমাধান খুঁজে পেতে পারে এমন একটি প্রোগ্রাম লেখাই মার্জিত।
এমন একটি প্রোগ্রাম তৈরি করা যা একটি GPU এর বৈশিষ্ট্যগুলি আরও দ্রুত করার জন্য দক্ষতার সাথে ব্যবহার করে মার্জিত।
"যাদুঘর" এর একটি অংশে কাজ করা মার্জিত।
কেবলমাত্র কলম এবং কাগজ ব্যবহার করে সম্ভবত ব্যবহার করা যেতে পারে এমন একটি সমাধান পদ্ধতি সন্ধান করা অত্যন্ত মার্জিত।
আপনার সমাধানটি একটি শিক্ষামূলক এবং সহজে বোধগম্য পদ্ধতিতে ব্যাখ্যা করা মার্জিত।

একাধিক বা খুব ব্যয়বহুল কম্পিউটার ব্যবহার করা সহজ নয়।


আপনি কি নিশ্চিত যে এর জন্য একটি উত্তর বিদ্যমান?
ডগবার্ট

হ্যাঁ, তাদের মধ্যে 256 ডলার রয়েছে। এবং আমি নিশ্চিত যে একটি আধুনিক পিসি এবং সঠিক প্রোগ্রামিংয়ের ফলে কয়েক মিনিটের মধ্যে উত্তর খুঁজে পাওয়া সম্ভব।
আআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআ

শুধু ভাবছি, জিপিইউগুলি মার্জিত তবে একাধিক সিপিইউ নয় কেন?
জেবি

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

আমি যদি আমার কার্য কোড জমা দিই তবে এটি প্রায় এমন মনে হয় যে আমি একটি বড় গুচ্ছ বীজ জোড়া জমা দিয়েছি। ইতিমধ্যে খেলা শেষ?
জেবি

উত্তর:


6

সি ++, 44014022/164607120

এটি সি ++ এ রয়েছে, 1 গিগাবাইট মেমরি ব্যবহার করে এবং এই প্রথম জুটির সন্ধান করতে প্রায় 45 সেকেন্ড সময় নেয়। সময়টি সবগুলি খুঁজে পেলে আমি আপডেট করব।

নীচে কোড। এটি প্রথমে 4 টি শূন্য উত্পন্ন সমস্ত জোড়া খুঁজে বের করে, তারপরে সাধারণ পরীক্ষার মাধ্যমে সেগুলি ঝাঁকিয়ে দেয় ( checkপদ্ধতিটি দেখুন)। এটি এমন দুটি জোড়া খুঁজে পেয়েছে যা দুটি বড় অ্যারে তৈরি করে 4 টি শূন্য উত্পন্ন করে, একটিতে রাজ্যের 1 জেনারেটরের প্রথম 4 লো-অর্ডার বাইট রয়েছে এবং দ্বিতীয়টিতে স্টেট 2 জেনারেটরের প্রথম 4 লো-অর্ডার বাইটের নেতিবাচক রয়েছে। এই অ্যারেগুলি এর পরে বাছাই করা হয় এবং একটি ম্যাচের জন্য অনুসন্ধান করা হয়, যা শুরুতে সামগ্রিক জেনারেটরের 4 জিরো আউটপুট দেয় to

অ্যারেগুলি মেমোরিতে সঞ্চয় করার জন্য খুব বড়, সুতরাং এটি কেবল মেমরির সাথে ফিট করার জন্য মাপের ব্যাচগুলিতে কাজ করে।

দেখে মনে হচ্ছে সম্পূর্ণ রানটি নিতে 12 ঘন্টা সময় লাগবে।

সম্পাদনা করুন : কোডটি উন্নত করা হয়েছে যাতে সমস্ত সম্ভাব্য বীজ পেতে কেবল ~ 1 ঘন্টা লাগে। এখন এটি 256 টি পৃথক ফাইলে সারণী তৈরি করে, আউটপুটটির প্রতিটি প্রথম বাইটের জন্য একটি। তারপরে আমরা প্রতিটি ফাইল স্বাধীনভাবে প্রক্রিয়া করতে পারি যাতে আমাদের ডেটা পুনরায় তৈরি করতে হবে না।

সম্পাদনা : দেখা যাচ্ছে আপনি একবারে পরিবর্তে পৃথকভাবে 256 উপশমগুলি তৈরি করতে পারেন, সুতরাং কোনও ডিস্কের প্রয়োজন নেই। 256MB ব্যবহার করে 15 মিনিটের কম সময় চালানো।

#include <stdio.h>
#include <stdint.h>
#include <algorithm>
using namespace std;

#define M1 65539
#define N1 4294967087
#define M2 65537
#define N2 4294965887
#define MATCHES 7

// M^-1 mod N                                                                                                                                                        
#define M1_INV 3027952124
#define M2_INV 1949206866

int npairs = 0;

void check(uint32_t seed1, uint32_t seed2) {
  uint32_t s1 = seed1;
  uint32_t s2 = seed2;
  for (int i = 0; i < MATCHES; i++) {
    s1 = (uint64_t)s1 * M1 % N1;
    s2 = (uint64_t)s2 * M2 % N2;
    if (((s1 + s2) & 0xff) != 0) return;
  }
  printf("%d %u %u\n", npairs++, seed1, seed2);
}

struct Record {
  uint32_t signature; // 2nd through 5th generated bytes                                                                                                             
  uint32_t seed;      // seed that generated them                                                                                                                    
};
// for sorting Records                                                                                                                                               
bool operator<(const Record &a, const Record &b) {
  return a.signature < b.signature;
}

int main(int argc, char *argv[]) {
  Record *table1 = (Record*)malloc((N1/256+1)*sizeof(*table1));
  Record *table2 = (Record*)malloc((N2/256+1)*sizeof(*table2));

  for (int i = 0; i < 256; i++) {  // iterate over first byte                                                                                                        
    printf("first byte %x\n", i);

    // generate signatures (bytes 2 through 5) for all states of generator 1                                                                                         
    // that generate i as the first byte.                                                                                                                            
    Record *r = table1;
    for (uint64_t k = i; k < N1; k += 256) {
      uint32_t sig = 0;
      uint32_t v = k;
      for (int j = 0; j < 4; j++) {
        v = (uint64_t)v * M1 % N1;
        sig = (sig << 8) + (v & 0xff);
      }
      r->signature = sig;
      r->seed = k;
      r++;
    }
    Record *endtable1 = r;

    // generate signatures (bytes 2 through 5) for all states of generator 2                                                                                         
    // that generate -i as the first byte.                                                                                                                           
    r = table2;
    for (uint64_t k = (-i & 0xff); k < N2; k += 256) {
      uint32_t sig = 0;
      uint32_t v = k;
      for (int j = 0; j < 4; j++) {
        v = (uint64_t)v * M2 % N2;
        sig = (sig << 8) + (-v & 0xff);
      }
      r->signature = sig;
      r->seed = k;
      r++;
    }
    Record *endtable2 = r;

    sort(table1, endtable1);
    sort(table2, endtable2);

    // iterate through looking for matches                                                                                                                           
    const Record *p1 = table1;
    const Record *p2 = table2;
    while (p1 < endtable1  && p2 < endtable2) {
      if (p1->signature < p2->signature) p1++;
      else if (p1->signature > p2->signature) p2++;
      else {
        check((uint64_t)p1->seed * M1_INV % N1, (uint64_t)p2->seed * M2_INV % N2);
        // NOTE: may skip some potential matches, if p1->signature==(p1+1)->signature or p2->signature==(p2+1)->signature                                            
        p1++;
      }
    }
  }
}

আমি মনে করি নি যে হার্ডডিস্কটি কার্যের পক্ষে দক্ষ হওয়ার জন্য যথেষ্ট দ্রুত হবে। মজাদার.
aaaaaaaaaaaa
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.