আরডুইনোতে সত্যিকারের এলোমেলো নম্বর পাচ্ছেন


13

আরডুইনোতে সত্যিকারের (সিউডোর বিপরীতে) এলোমেলো নম্বর পাওয়ার সর্বোত্তম পদ্ধতি কী বা কমপক্ষে সবচেয়ে ভাল সম্ভাব্য সান্নিধ্য? আমার বোধগম্যতা থেকে, ফাংশনটি এলোমেলো সাeedদ (এনালগরিড (এক্স)) এটি যথেষ্ট এলোমেলো নয়।

যদি সম্ভব হয় তবে পদ্ধতিটি একাই বেসিক আরডুইনো সেটআপটি লাভ করবে (কোনও অতিরিক্ত সেন্সর নেই)। বাহ্যিক সেন্সরগুলির সাথে সমাধানগুলি যদি বুনিয়াদি সেটআপের তুলনায় এলোমেলোভাবে উল্লেখযোগ্যভাবে উন্নতি করে তবে তারা স্বাগত।


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

হ্যাঁ, ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত অ্যাপ্লিকেশনগুলির জন্য আমার এলোমেলো সংখ্যা দরকার।
রেকসিরাস

উত্তর:


10

এনট্রপি গ্রন্থাগার ব্যবহার করে:

সত্যিকারের এলোমেলো সংখ্যার একটি নির্ভরযোগ্য স্ট্রিম উত্পাদন করতে ওয়াচডগ টাইমারটির প্রাকৃতিক জিটর

আমি এই সমাধানটি পছন্দ করি কারণ এটি আপনার মাইক্রোকন্ট্রোলারের কোনও পিন ব্যবহার করে না এবং কোনও বাহ্যিক সার্কিটরির প্রয়োজন হয় না। এটি এটিকে বাহ্যিক ব্যর্থতারও কম বিষয় করে তোলে।

একটি লাইব্রেরি ছাড়াও, তারা এমন একটি স্কেচ সরবরাহ করে যা মাইক্রোকন্ট্রোলারের PRNG এর জন্য লাইব্রেরি ছাড়াই এলোমেলো বীজ উত্পাদন করতে ব্যবহৃত একই কৌশলটির ব্যবহার প্রদর্শন করে: https://sites.google.com/site/astudyofentropy/project-definition / টাইমার-নার্ভাসভাবে-এনট্রপি সূত্র / এনট্রপি-লাইব্রেরি / Arduino-রেণ্ডম-বীজ


8

randomSeed(analogRead(x))কেবলমাত্র 255 সংখ্যার সিক্যুয়েন্স তৈরি করবে, যা সমস্ত কম্বো চেষ্টা করে তাত্পর্যপূর্ণ করে এমন একটি ওরাকল তৈরি করে যা আপনার আউটপুট প্রবাহকে দম্পতি করতে পারে, সমস্ত আউটপুট 100% পূর্বাভাস দেয়। আপনি যদিও সঠিক পথে রয়েছেন এটি কেবল একটি সংখ্যার খেলা এবং এগুলির জন্য আপনাকে আরও অনেক বেশি প্রয়োজন। উদাহরণস্বরূপ, ৪ টি এডিসি থেকে ১০০ টি এনালগ রিড নেওয়া, সেগুলির সমস্ত সংক্ষিপ্ত করে নেওয়া এবং খাওয়ানো randomSeedআরও ভাল। সর্বাধিক সুরক্ষার জন্য আপনার অপ্রত্যাশিত ইনপুট এবং অ-নিরোধক উভয়ই মিশ্রণের প্রয়োজন।

আমি কোনও ক্রিপ্টোগ্রাফার নই, তবে আমি হার্ডওয়্যার এবং সফ্টওয়্যার এলোমেলো জেনারেটর নিয়ে গবেষণা এবং বিল্ডিংয়ের জন্য কয়েক হাজার ঘন্টা ব্যয় করেছি, তাই আমি যা শিখেছি তার কিছু ভাগ করে নিই:

অপ্রত্যাশিত ইনপুট:

  • অ্যানালগ রিড () (ভাসমান পিনগুলিতে)
  • GetTemp ()

সম্ভাব্য অপ্রত্যাশিত ইনপুট:

  • মাইক্রো () (ডাব্লু / একটি অ-ডিস্ট্রিমেন্টিক নমুনা সময়কাল)
  • ক্লক জিটার (লো ব্যান্ডউইথ, তবে ব্যবহারযোগ্য)
  • রিডভিসিসি () (ব্যাটারি চালিত না হলে)

বাহ্যিক অপ্রত্যাশিত ইনপুট:

  • অস্থায়ী, আর্দ্রতা এবং চাপ সেন্সর
  • মাইক্রোফোনের
  • এলডিআর ভোল্টেজ ডিভাইডার
  • বিপরীত পক্ষপাত ট্রানজিস্টর শব্দ
  • কম্পাস / ত্বরণ জিটার
  • esp8266 ওয়াইফাই হটস্পট স্ক্যান (এসএসডি, ডিবি, ইত্যাদি)
  • esp8266 সময়সীমা (পটভূমি ওয়াইফাই কাজগুলি নির্ধারিত মাইক্রো তৈরি করে () অনির্দিষ্ট করে তোলে)
  • esp8266 HWRNG - RANDOM_REG32অত্যন্ত দ্রুত এবং অবিশ্বাস্য, একটি 1-স্টপ

সংগ্রহ আপনি শেষ কাজটি করতে চান এন্ট্রপি যেমন হয় আসে। এক বালতি মুদ্রার চেয়ে কয়েন ফ্লিপ অনুমান করা আরও সহজ। সামিং ভাল। unsigned long bank;তাহলে পরে bank+= thisSample;ভাল; এটি ঘূর্ণায়মান হবে। bank[32]আরও ভাল, পড়ুন। আপনি আউটপুট প্রতিটি অংশের জন্য ইনপুট এর কমপক্ষে 8 টি নমুনা সংগ্রহ করতে চান, আদর্শভাবে আরও অনেক কিছু।

বিষের বিরুদ্ধে সুরক্ষা যদি বোর্ডটি গরম করার ফলে নির্দিষ্ট সর্বাধিক ঘড়ির ঝাঁকুনির সৃষ্টি হয় তবে এটি আক্রমণ আক্রমণকারী। অ্যানালগ রিড () ইনপুটগুলির দিকে আরএফআই ব্লাস্টিংয়ের সাথে একই। অন্য এক সাধারণ আক্রমণটি ইউনিটকে কেবল প্লাগ ইন করে রাখে এবং এইভাবে সমস্ত জমে থাকা এনট্রপি ডাম্প করে। এমনকি গতি ব্যয়ে এমনকি এটি করা নিরাপদ না হওয়া অবধি আপনার সংখ্যা আউটপুট করা উচিত নয়।

এজন্য আপনি EEPROM, SD ইত্যাদি ব্যবহার করে দীর্ঘমেয়াদে কিছুটা ইন্ট্রপিকে রাখতে চান, ফরচুনা পিআরএনজি দেখুন , যা 32 টি ব্যাঙ্ক ব্যবহার করে, প্রতিটি তার আগের হিসাবে প্রায় অর্ধেক আপডেট হয়। এটি যুক্তিসঙ্গত সময়ে সমস্ত 32 টি ব্যাঙ্ককে আক্রমণ করা শক্ত করে তোলে।

প্রসেসিং একবার আপনি "এন্ট্রপি" সংগ্রহ করার পরে, আপনাকে এটিকে পরিষ্কার করতে হবে এবং কঠোর-বিপরীত পথে ইনপুট থেকে ডিভোর্স দিতে হবে। এসএএএ / 1/256 এটির জন্য ভাল। আপনার কাছে একটি সরলপাঠের দুর্বলতা না থাকায় আপনি গতির জন্য SHA1 (বা এমনকি MD5 এমনকি) ব্যবহার করতে পারেন। ফসল কাটাতে কখনই পুরো এনটপি ব্যাঙ্ক ব্যবহার করবেন না এবং কোনও এনট্রপি ব্যাঙ্ক পরিবর্তন না করে অভিন্ন ফলাফলকে প্রতিরোধ করতে সর্বদা আউটপুটটিতে সর্বদা একটি "নুন" যুক্ত করুন: output = sha1( String(micros()) + String(bank[0]) + [...] );শে ফাংশন দু'টি আউটপুট এবং সাদা রঙের আউটপুট আড়াল করে দুর্বল বীজের বিরুদ্ধে রক্ষা করে, কম জমে থাকা এনটি, এবং অন্যান্য সাধারণ সমস্যা।

টাইমার ইনপুটগুলি ব্যবহার করতে, আপনাকে সেগুলি নির্বিচারবাদী করতে হবে। এটি একটি সাধারণ হিসাবে delayMicroseconds(lastSample % 255); যা সময়ের একটি অপ্রত্যাশিত পরিমাণকে বিরতি দেয় এবং "ক্রমাগত" ঘড়িটি অ-ইউনিফর্মের সাথে পার্থক্য করে making আধা-নিয়মিত করুন, যেমন if(analogRead(A1)>200){...}, সরবরাহিত A1 শোরগোলযুক্ত বা গতিশীল ইনপুটটিতে আবদ্ধ। আপনার প্রবাহের প্রতিটি কাঁটাচামচ নির্ধারণের পরিবর্তে তৈরি করা পচে যাওয়া / ছিঁড়ে যাওয়া আউটপুটটিতে ক্রিপটোয়ানালাইসিসকে আটকাবে।

আসল সুরক্ষা হ'ল যখন আক্রমণকারী আপনার পুরো সিস্টেমটি জানে এবং এখনও এটি অতিক্রম করতে অসহায় থাকে।

সবশেষে, আপনার কাজ পরীক্ষা করুন। ENT.EXE (নিক্স / ম্যাকের জন্য উপলব্ধ) এর মাধ্যমে আপনার আউটপুট চালান এবং দেখুন এটি কোনও ভাল কিনা। সর্বাধিক গুরুত্বপূর্ণ হ'ল চি বর্গ বিতরণ, যা সাধারণত 33% এবং 66% এর মধ্যে হওয়া উচিত। আপনি যদি 1.43% বা 99.999% বা এর মতো কিছু পেয়ে থাকেন তবে একের পর এক পরীক্ষার বেশি, আপনার এলোমেলো কর্কশ। আপনি অবশ্যই এনট্রপি ইএনটি প্রতিবেদন হিসাবে বাইট প্রতি 8 বিটের কাছাকাছি,> অবশ্যই 7.9 নিশ্চিত করতে চান।

টিএলডিআর: সবচেয়ে সহজ বোকা-প্রমাণ উপায় হল ESP8266 এর এইচডব্লিউআরএনজি N এটি দ্রুত, অভিন্ন এবং অনুমানযোগ্য। আর্ডুনিও কোর চলমান কোনও ESP8266 এ এর ​​মতো কিছু চালান, এবং AVR এর সাথে কথা বলার জন্য সিরিয়াল ব্যবহার করুন:

// ESP8266 Arduino core code:
void setup(){
 Serial.begin(9600); // or whatever
}

void loop() {
  // Serial.write((char)(RANDOM_REG32 % 256)); // "bin"
  Serial.print( String(RANDOM_REG32, HEX).substring(1)); // "hex"
}

** সম্পাদনা করুন

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

স্কেচটি আমার উত্তর এবং ফলো-আপ মন্তব্যগুলিতে আমি উল্লেখ করেছি এমন কয়েকটি ধারণাকে একীভূত করেছে: এনট্রপি সংগ্রহ করা, কম-আদর্শ-আদর্শ এনট্রোপি (ভন নিউম্যান বলেছিল এটি দুর্দান্ত) ওভার স্যাম্পলিং দ্বারা প্রসারিত, এবং অভিন্নতা অর্জনের জন্য। এটি এনট্রপি মানের অনুমানটি "সম্ভবত গতিময় কোনও কিছু" গেমের পক্ষে এবং কোনও ক্রিপ্টোগ্রাফিক আদিম ব্যবহার করে মেশানোর পক্ষে যায়।

// AVR (ardunio) HWRNG by dandavis. released to public domain by author.
#include <Hash.h> 

unsigned long read[8] = {0, 0, 0, 0, 0, 0, 0, 0};
const int pincount = 9; // adjust down for non pro-mini boards
int pins[9] = {A0, A1, A2, A3, A4, A5, A6, A7, A0}; // adjust for board, name analog inputs to be sampled
unsigned int ticks = 0;
String buff = ""; // holds one round of derivation tokens to be hashed.
String cache; // the last read hash



void harvest() { // String() slows down the processing, making micros() calls harder to recreate
  unsigned long tot = 0; // the total of all analog reads
  buff = String(random(2147483647)) + String(millis() % 999);
  int seed =  random(256) + (micros() % 32);
  int offset =  random(2147483647) % 256;

  for (int i = 0; i < 8; i++) {
    buff += String( seed + read[i] + i + (ticks % 65), HEX );
    buff += String(random(2147483647), HEX);
    tot += read[i];
  }//next i

  buff += String( (micros() + ticks + offset) % 99999, HEX);
  if (random(10) < 3) randomSeed(tot + random(2147483647) + micros()); 
  buff = sha1( String(random(2147483647)) + buff + (micros()%64) + cache); // used hash to uniform output and waste time
  Serial.print( buff ); // output the hash
  cache = buff;
  spin();
}//end harvest()


void spin() { // add entropy and mix
  ticks++;
  int sample = 128;
  for (int i = 0; i < 8; i++) { // update ~6/8 banks 8 times
    read[ read[i] % 8] += (micros() % 128);
    sample = analogRead(  pins[i] ); // a read from each analog pin
    read[ micros() % 8] += ( read[i] % 64 ); // mix timing and 6LSBs from read
    read[i] += sample; // mix whole raw sample
    read[(i + 1) % 8] += random(2147483647) % 1024; // mix prng
    read[ticks % 8] += sample % 16; // mix the best nibble of the read
    read[sample % 8] += read[ticks % 8] % 2147483647; // intra-mix banks
  }

}//end spin()



void setup() {
  Serial.begin(9600);
  delay(222);
  int mx = 2028 + ((analogRead(A0)  + analogRead(A1) + analogRead(A2)  + analogRead(A3)) % 256);  
  while (ticks < mx) {
    spin();
    delay(1);
    randomSeed(read[2] + read[1] + read[0] + micros() + random(4096) + ticks);
  }// wend
}// end setup()



void loop() {
  spin();
  delayMicroseconds((read[ micros() % 8] %  2048) + 333  );
  delay(random(10));
  //if (millis() < 500) return;
  if ((ticks % 16) == (millis() % 16) ) harvest();
}// end loop()

(আমি এখানে অক্ষরের উপর সংক্ষিপ্ত, দুঃখিত।) ভাল ওভারভিউ! আমি লবণের জন্য একটি কাউন্টার ব্যবহার করার পরামর্শ দেব; মাইক্রো () হ'ল বিটের অপচয়, কারণ এটি কলগুলির মধ্যে বেশ কয়েকটি ধাপে লাফিয়ে উঠতে পারে। অ্যানালগ ইনপুটগুলিতে উচ্চ বিটগুলি এড়িয়ে চলুন, সর্বনিম্ন এক বা দুটি বিটের মধ্যে সীমাবদ্ধ। এমনকি একটি লক্ষ্যযুক্ত আক্রমণে এগুলি পিন করা শক্ত (যদি না আপনি ইনপুটটিতে একটি তারের না রেখে)। "অ-নিরস্তক মিশ্রণ" এমন কিছু নয় যা আপনি সফ্টওয়্যারটিতে করতে পারেন in SHA-1 মেশানো মানক করা হয়েছে: crypto.stackexchange.com/a/6232 । ইন্ডেট আপনার প্রস্তাবিত টাইমারটি আপনার ইতিমধ্যে উত্স হিসাবে কেবল এলোমেলো। এখানে খুব বেশি লাভ নেই।
জোনাস শোফার

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

1
আমার একটা প্রশ্ন আছে. আপনি বলেছিলেন যে 100 টি ব্যবস্থা নেওয়া আরও ভাল। কিন্তু প্রচুর ব্যবস্থা নেওয়া হচ্ছে না এমন এক ধরণের "গড়" যা এই "এলোমেলো" ডেটা নেওয়ার কার্যকারিতা সীমাবদ্ধ করে? আমার অর্থ, সাধারণত আপনি কম গোলমাল (এত কম "এলোমেলো") পরিমাপ পাওয়ার জন্য গড় গড়ে
তোলেন

ভাল আমি ধ্রুবক নমুনা দেওয়ার প্রস্তাব দিই, আমি কেবল বলছিলাম যে এটি 1 এর চেয়ে 100 ভাল তবে এটি আরও সংমিশ্রণের প্রস্তাব দেয়। ইয়ারো / ফরচুনার মতো সংগ্রহের মডেল এখনও আরও ভাল better হ্যাশিংয়ের আগে সেই 100 টি অ্যানালগ নমুনা সংক্ষেপণ (সংক্ষেপে নয়) বিবেচনা করুন; শক্তিশালী কারণ এটি নমুনা ক্রমকে গুরুত্বপূর্ণ করে তোলে এবং এক গৃহস্থালি থেকে সম্পূর্ণ আলাদা হ্যাশ পাওয়া যায়। সুতরাং, যদিও কেউ কম শোরগোল পাওয়ার জন্য নমুনাগুলির গড় গড় করতে পারে, তবুও একজন আক্রমণকারীকে সমস্ত মান বা কোনও মিলই বাছাই করতে হবে না ... আমার মূল বিষয়টি একটি নির্দিষ্ট শব্দ উত্সের পক্ষে কথা বলার চেয়ে আরও বেশি "জমা, মিশ্রণ এবং যাচাই করা" is
ডান্ডাভিস

4

আমার অভিজ্ঞতা থেকে, analogRead()ভাসমান পিনটিতে খুব কম এনট্রপি রয়েছে। প্রতি কলে এলোমেলোতার দুটি বা দুটি বিট। আপনি অবশ্যই আরও ভাল কিছু চান। প্রতি 1234 এর উত্তরে প্রস্তাবিত ওয়াচডগ টাইমারের জিটারটি একটি ভাল বিকল্প। তবে এটি বেশ ধীর গতিতে এনট্রপি জেনারেট করে, যা প্রোগ্রাম শুরু হওয়ার সাথে সাথে আপনার প্রয়োজন হলে এটি সমস্যা হতে পারে। ডান্ডাভিসের বেশ কয়েকটি ভাল পরামর্শ রয়েছে তবে তাদের সাধারণত একটি ESP8266 বা বাহ্যিক হার্ডওয়্যার প্রয়োজন।

একটি আকর্ষণীয় এনট্রপি উত্স রয়েছে যা এখনও উল্লেখ করা হয়নি: অবিরাম র‌্যামের সামগ্রী। যখন এমসিইউ চালিত হয়, তখন এর কিছু র‌্যাম বিটস (বেশিরভাগ প্রতিসম ট্রানজিস্টরগুলির ক্ষেত্রে ঘটে থাকে) এলোমেলো অবস্থায় শুরু হয়। এই হ্যাকডে নিবন্ধে যেমন আলোচনা হয়েছে , এটি কোনও এনট্রপি উত্স হিসাবে ব্যবহার করা যেতে পারে। এটি কেবলমাত্র একটি ঠান্ডা বুটে পাওয়া যায়, তাই আপনি এটি প্রাথমিক এন্ট্রপি পুলটি পূরণ করতে ব্যবহার করতে পারেন, যা আপনি পর্যায়ক্রমে অন্য কোনও, সম্ভাব্য ধীর উত্স থেকে পূরণ করতে পারেন। এইভাবে আপনার প্রোগ্রামটি পুলটি ধীরে ধীরে পূরণের জন্য অপেক্ষা না করেই এটির কাজ শুরু করতে পারে।

এটিভিআর ভিত্তিক আরডুইনোতে কীভাবে এটি কাটা যেতে পারে তার একটি উদাহরণ এখানে। XOR এর নীচে কোড স্নিপেটটি পরে রোধ করে এমন একটি বীজ তৈরির জন্য পুরো র‍্যামকে পুরো র‍্যাম দেয় srandom()। জটিল অংশটি হ'ল সি রানটাইম .Data এবং .bss মেমরি বিভাগগুলি শুরু করার আগেই ফসল কাটাতে হবে এবং তারপরে সি রানটাইম ওভাররাইট লিখিত হবে না এমন জায়গায় বীজ সংরক্ষণ করতে হবে। এটি নির্দিষ্ট মেমরি বিভাগ ব্যবহার করে করা হয় ।

uint32_t __attribute__((section(".noinit"))) random_seed;

void __attribute__((naked, section(".init3"))) seed_from_ram()
{
    const uint32_t * const ramstart = (uint32_t *) RAMSTART;
    const uint32_t * const ramend   = (uint32_t *) RAMEND;
    uint32_t seed = 0;
    for (const uint32_t *p = ramstart; p <= ramend; p++)
        seed ^= *p;
    random_seed = seed;
}

void setup()
{
    srandom(random_seed);
}

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

সম্পাদনা করুন : আমার প্রাথমিক সংস্করণে কোনও সমস্যা স্থির হয়েছে seed_from_ram()যা random_seedস্থানীয় ব্যবহারের পরিবর্তে বিশ্বব্যাপী কাজ করেছে seed। এটি বীজকে নিজেই XORed হতে পারে এবং এ পর্যন্ত কাটা সমস্ত এনট্রপি ধ্বংস করে দিতে পারে।


চমৎকার কাজ! আমি কি চুরি করতে পারি? পুনরায়: পিনস: ডান ব্যবহার করা হলে অজানা এক বা দুটি বিট যথেষ্ট; এটি কেবল নিখুঁত গোপনীয়তার আউটপুট গতি সীমিত করবে (ইয়াক), তবে আমাদের যে
গণনাগত

1
@ ডান্ডাভিস: হ্যাঁ, আপনি অবশ্যই পুনরায় ব্যবহার করতে পারবেন sure আপনি analogRead()কী করছেন তা যদি আপনি জানেন তবে আপনি ব্যবহারযোগ্য হওয়ার বিষয়ে সঠিক। আপনার পুলের এনট্রপির একটি প্রাক্কলন আপডেট করার সময় আপনাকে কেবল তার এলোমেলোতাটিকে অত্যধিক পর্যালোচনা না করার বিষয়ে যত্নবান হতে হবে। সম্পর্কে আমার বক্তব্য analogRead()বেশিরভাগই একটি দরিদ্র এখনো একটি সমালোচনা হিসাবে বোঝানো হয় প্রায়ই পুনরাবৃত্তি "রেসিপি" : randomSeed(analogRead(0)) শুধু একবার মধ্যে setup()এবং এটি এর যথেষ্ট অনুমান।
এডগার বোনেট

যদি analogRead(0)কলটিতে প্রতি 1 বিট এনট্রপি থাকে, তবে বারবার কল করলে এটি 10000/8 = 1.25 কেবিট / সেকেন্ড এন্ট্রপি উপার্জন করবে, এন্ট্রপি লাইব্রেরির চেয়ে দেড়গুণ বেশি।
দিমিত্রি গ্রিগরিয়েভ

0

আপনার যদি সত্যই এনট্রপি প্রয়োজন না এবং প্রতিটি সূচনাতে ছদ্ম-এলোমেলো সংখ্যার আলাদা ধারা পেতে চান তবে আপনি পরপর বীজের মধ্য দিয়ে পুনরাবৃত্তি করতে EEPROM ব্যবহার করতে পারেন। প্রযুক্তিগতভাবে প্রক্রিয়াটি সম্পূর্ণ নির্মূল করবে, তবে ব্যবহারিক দিক থেকে এটি randomSeed(analogRead(0))একটি সংযুক্ত পিনের চেয়ে অনেক ভাল , যা আপনাকে প্রায় 0 বা 1023 এর একই বীজ দিয়ে শুরু করতে পারে E প্রতিবার বীজ।

#include <EEPROM.h>

const int seed_addr = 0;
unsigned long seed;

void setup() {
    seed = EEPROM.read(seed_addr);
    EEPROM.write(seed_addr, seed+1);
    randomSeed(seed);
}

আপনার যদি সত্যিকারের এনট্রপি দরকার হয় তবে আপনি এটি ক্লক ড্রিফ্ট থেকে সংগ্রহ করতে পারেন, বা বাহ্যিক শব্দকে প্রশস্ত করে। এবং আপনার যদি অনেক এনট্রপি দরকার হয় তবে বাহ্যিক শোরগোলই কেবলমাত্র কার্যকর বিকল্প। জেনার ডায়োড একটি জনপ্রিয় পছন্দ, বিশেষত যদি আপনার 5-6V এর উপরে ভোল্টেজ উত্স থাকে (এটি একটি উপযুক্ত জেনার ডায়োডের সাথে 5V এর সাথেও কাজ করবে তবে কম এন্ট্রপি তৈরি করবে):

এখানে চিত্র বর্ণনা লিখুন

( উত্স )

এম্প্লিফায়ার আউটপুটটিকে একটি অ্যানালগ পিনের সাথে সংযুক্ত করতে হবে, যা প্রতিটি দশকে analogRead()মেগা হার্জ পর্যন্ত এনট্রপির বিভিন্ন বিট তৈরি করবে (আরডুইনোর চেয়ে নমুনা তুলনায় দ্রুত))

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