এফপিজিএতে সমান্তরাল SHA256 গণনা

এফপিজিএতে সমান্তরাল SHA256 গণনা

কয়েক সপ্তাহ আগে, আমি একটি নিবন্ধ লিখেছিলাম যেখানে আমি একটি এফপিজিএতে একটি হ্যাশ ক্যালকুলেটর তৈরি করেছি। বিশেষত, আমি একটি SHA-256 ক্যালকুলেটর প্রয়োগ করেছি। এই মডিউলটি 68 ঘড়ি চক্রের একটি স্ট্রিংয়ের (25 বাইট পর্যন্ত) হ্যাশ গণনা করে।

ডিজাইনটি ডাব্লু ম্যাট্রিক্স এবং পুনরাবৃত্ত রাউন্ডগুলি একই সাথে গণনা করতে এফপিজিএগুলির সমান্তরালতা উপার্জন করে। যাইহোক, এটি প্রতি 68 টি ঘড়ির চক্রের মাত্র একটি হ্যাশ উত্পাদন করে, বেশিরভাগ এফপিজিএর বেশিরভাগ অংশকে সেই সময়ের মধ্যে স্বল্প ব্যবহার করে।

এই নিবন্ধে আমরা একই সাথে বেশ কয়েকটি হ্যাশ কম্পিউটারে সক্ষম হতে হ্যাশ ক্যালকুলেটরগুলির একটি সেট যুক্ত করে সেই সিস্টেমের কার্যকারিতা উন্নত করতে যাচ্ছি।

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

এফএসএম ডায়াগ্রাম

এই দুটি পরিবর্তন কোর দ্বারা ব্যবহৃত যুক্তি হ্রাস করে এবং এর কার্যকারিতা উন্নত করে। এই নতুন শ কোর নামকরণ করা হয়েছে sha256_core_pif (পিআইএফ মানে সমান্তরাল ইন্টারফেস)।

module sha256_core_pif (
  input wire aclk, 
  input wire aresetn, 

  /* input data channel */
  input wire (31:0) string_w0,
  input wire (31:0) string_w1,
  input wire (31:0) string_w2,
  input wire (31:0) string_w3,
  input wire (31:0) string_w4,
  input wire (31:0) string_w5,
  input wire (31:0) string_w6,
  input wire (31:0) string_w7,
  input wire (31:0) string_w8,
  input wire (31:0) string_w9,
  input wire (31:0) string_w10,
  input wire (31:0) string_w11,
  input wire (31:0) string_w12,
  input wire (31:0) string_w13,
  input wire string_dv,
  output wire string_ready,
  input wire (7:0) string_size,
  output reg (6:0) round,
  input wire (31:0) k_round,
  
  /* output data channel */
  output reg sha256_dv,
  output reg (255:0) sha256_data
);

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

আমি যে অ্যাপ্লিকেশনটি প্রয়োগ করেছি তা হ’ল একটি সাধারণ হ্যাশ ক্র্যাকার বা পাসওয়ার্ড ক্র্যাকার। এটি একটি SHA-256 হ্যাশ গ্রহণ করে এবং এটি উত্পন্ন মূল স্ট্রিংটি পুনরুদ্ধার করার চেষ্টা করে। এটি বিশ্লেষণাত্মকভাবে সমাধান করা যায় না; পরিবর্তে, SHA256_manager প্রথম মুদ্রণযোগ্য চরিত্র থেকে শুরু করে আইট্রেটিভভাবে প্রার্থী স্ট্রিংগুলি হ্যাশ করে। এরপরে এটি চরিত্রটিকে শেষ পর্যন্ত পৌঁছানো পর্যন্ত বৃদ্ধি করে, যেখানে এটি একটি নতুন চরিত্র যুক্ত করে এবং প্রক্রিয়াটি পুনরায় চালু করে।

এখানে 95 টি মুদ্রণযোগ্য ASCII অক্ষর রয়েছে। এর অর্থ সিস্টেমটি অবশ্যই দৈর্ঘ্যের 1, 95^2 = 9 025 এর দুটি চরিত্রের স্ট্রিংগুলির জন্য 95 টি হ্যাশগুলি গণনা করতে হবে এবং তিন-চরিত্রের স্ট্রিংগুলির জন্য 95^3 = 857 375 অবশ্যই গণনা করতে হবে। সাধারণভাবে, প্রয়োজনীয় হ্যাশগুলির সংখ্যা দৈর্ঘ্যের এন এর স্ট্রিংগুলির জন্য 95^n।

সব sha256_core_pif হ্যাশ গণনা করা, এবং SHA256_manager প্রাপ্ত হ্যাশের সাথে সমস্ত তুলনা করে। যদি তাদের মধ্যে একটি একই হয় তবে হ্যাশ প্রথমটিতে প্রেরণ করা হয়েছে sha256_core_pif হোস্ট কম্পিউটারে প্রেরণ করা হয়, এবং এর সংখ্যাও sha256_core_pif এটি সঠিক হ্যাশ গণনা করে। এইভাবে, হোস্ট কম্পিউটার সঠিক স্ট্রিং পেতে পারে।

প্রকল্পটি পিসিআইয়ের ওপরে রাস্পবেরি পাই 5 এর সাথে সংযুক্ত লাইটফুরি বোর্ড ব্যবহার করে। পরবর্তী ডায়াগ্রামে আপনি ভিভাডোর ব্লক ডিজাইনটি পেতে পারেন।

লিভিং ব্লক ডিজাইন

সময় প্রয়োজনীয়তাগুলি পূরণ করতে, আমার অ্যাক্সি ঘড়ির গতি 62.5 মেগাহার্টজ এ কমিয়ে আনতে হবে। এই কনফিগারেশনটি ব্যবহার করে, আমি 12 ইন্টিগ্রেট করতে সক্ষম হয়েছি sha256_core_pif মডিউল।

ডিএমএ অ্যাক্সি ঘড়ি

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

ব্যবহার

12 টি এক্সিলারেটর এবং 62.5MHz এর একটি ঘড়ির গতি ব্যবহার করে সমস্ত প্রয়োজনীয়তা পূরণ করা হয়েছিল।

সময়

হোস্ট সাইডে, আমি লাইটফুরি পরিচালনা করতে একটি পাইথন ড্রাইভার তৈরি করেছি। আমি এই নিবন্ধে আমরা যে পরিবর্তন করেছি তা দিয়ে জিলিনেক্সের এক্সডিএমএ ড্রাইভারগুলি ব্যবহার করেছি। এখন, পাইথন ড্রাইভারটি কেবল খুলতে হবে /dev/xdma0_user পেরিফেরাল, এবং এক্সি পেরিফেরালের রেজিস্টার মানচিত্র অনুসারে নিবন্ধগুলি লিখুন।

def __init__(self, uio_path="/dev/xdma0_user", map_size=0x20000):
    self.fd = os.open(uio_path, os.O_RDWR | os.O_SYNC)
    self.map_size = map_size
    self.m = mmap.mmap(self.fd, self.map_size, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE, offset=0)

def close(self):
    self.m.close()
    os.close(self.fd)

def write(self, addr, value):
    self.m.seek(addr+self.AXI_PERIPH_OFFSET)
    self.m.write(struct.pack("<I", value))  # Little endian

def read(self, addr):
    self.m.seek(addr+self.AXI_PERIPH_OFFSET)
    return struct.unpack("<I", self.m.read(4))(0)

যেমনটি আমি আগেই উল্লেখ করেছি, চূড়ান্ত স্ট্রিংটি পেতে, আমাদের ফলাফলের স্ট্রিং ঠিকানাগুলি পড়তে হবে এবং বিজয়ী মডিউলটির সংখ্যা যুক্ত করতে হবে।

def get_password(self, winner):
    pw = b''
    for addr in self.REG_R:
        word = self.read(addr)
        pw += word.to_bytes(4, 'big')
    # Add the value of the winner as integer to the resulting string
    pw_int = int.from_bytes(pw, 'big') + winner
    # Convert the result to bytes
    pw_bytes = pw_int.to_bytes(len(pw), 'big')
    # Invert the order of the result
    pw_bytes = pw_bytes(::-1)
    # ASCII decodingssh p
    return pw_bytes.rstrip(b'\x00').decode('ascii', errors='ignore')

প্রকল্পটি পরীক্ষা করার জন্য, আমি আরও একটি পাইথন স্ক্রিপ্ট তৈরি করেছি যা একটি স্ট্রিংয়ের শা -256 গণনা করে (এটি ওপেনএসএসএল লাইব্রেরি ব্যবহার করেও করা যেতে পারে)। তারপরে, গণনা করা হ্যাশটি এক্সিলারেটরে প্রেরণ করা হয় এবং এটি প্রাথমিক স্ট্রিংটি ফেরত দেয়।

~/pass_cracker/python $ python3 sha256_comp.py eoi
SHA-256 of 'eoi': 7c02b8671bb4824e1cea44af7b628e88b81495699d5e9cb0e2533af99320a81b

~/pass_cracker/python $ sudo python3 pass_cracker.py 7c02b8671bb4824e1cea44af7b628e88b81495699d5e9cb0e2533af99320a81b
Password: eoi

এই জাতীয় প্রকল্পগুলি এফপিজিএগুলির সাথে অপরিচিত ইঞ্জিনিয়ারদের কাছে বেশ চিত্তাকর্ষক হতে পারে। সমান্তরালভাবে বিভিন্ন কাজ সম্পাদন করে-এবং এমনকি একাধিক হ্যাশ ক্যালকুলেটর ব্যবহার একসাথে ব্যবহার করে-প্রায়শই এফপিজিএ প্রযুক্তিতে কৌতূহল এবং আগ্রহকে উত্সাহিত করে sha-256 গণনাকে ত্বরান্বিত করার ক্ষমতা।

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

এই প্রকল্পের সমস্ত ফাইল ভাগ করা হয় কন্ট্রোলপথস গিথুব

আপনি কি কোনও ক্রিপ্টোগ্রাফি প্রকল্পে জড়িত এবং জানতে চান যে কোনও এফপিজিএ সাহায্য করতে পারে কিনা? আমার সাথে যোগাযোগ করুন।

Source link

মন্তব্য করুন

আপনার ই-মেইল এ্যাড্রেস প্রকাশিত হবে না। * চিহ্নিত বিষয়গুলো আবশ্যক।