كيفية تأمين الرسائل على EOS

إن blockchain هو دفتر الأستاذ الموزع وكل كتلة من البيانات متاحة للجميع ليراها الجميع. قد تتساءل عما إذا كنت أريد تشفير الرسائل على blockchain ، على وجه التحديد ، على EOS؟

كيف يعمل تأمين الرسائل على blockchain

يمكننا دمج NuCypher. يساعد NuCypher مطوري dApp على تخزين البيانات الخاصة ومشاركتها وإدارتها على سلاسل الحظر العامة مع إعادة تشفير الوكيل اللامركزي كخدمة.

هنا هو كيف يعمل.

  1. لدى أليس بيانات حساسة تريد أن تكون قادرة على تفويض الوصول إليها.
  2. تقوم Alice بتشفير بياناتها باستخدام المفتاح العمومي الخاص بها وتخزينها في السحابة ، أو التخزين اللامركزي.
  3. أليس مندوبي الوصول إلى بوب. يتم تحويل البيانات إلى مفتاح Bob في التخزين.
  4. يقوم بوب بتنزيل البيانات وفك تشفيرها باستخدام مفتاحه الخاص.

تأمين رسالة على EOS

سنبدأ بالسيناريو الذي يمكن فيه لكل من Alice و Bob الوصول إلى المفتاح الخاص وتريد Alice إرسال بيانات حساسة إلى Bob ، والاستفادة من pyUmbral وهو تطبيق مرجع من NuCypher لـ Umbral (إعادة تشفير وكيل الحد الأدنى لتقسيم المفاتيح).

لنقم أولاً بإنشاء قائمة انتظار لعقد الرسائل على EOS.

يقوم بإنشاء جدول واحد يسمى الرسائل ، والذي يحتوي على uint64_t msg_id ، account_name من ، account_name إلى ، نص تشفير السلسلة ، وكبسولة السلسلة. msg_id هو المفتاح الأساسي.

ويوفر إجراءين: sendmsg و deletemsg. يتطلب sendmsg account_name من وإلى ، msg_id ، النص المشفر والكبسولة. النص المشفر هو الرسالة المشفرة والكبسولة هي المفهوم في Umbral ، والذي يتم إنشاؤه باستخدام pyUmbral. يأخذ deletemsgbasically msg_id ، يتحقق من المحدد إلى account_name ، ثم يحذف السجل.

قائمة انتظار الصف: eosio العامة :: contract {
    عامة:
        باستخدام العقد :: العقد ؛
        // @ عمل أبي
        باطلة sendmsg (account_name من ، account_name إلى ، uint64_t msg_id ، const std :: string & ciphertext، const std :: string & capsule) {
            require_auth (من) ؛
            messages_index messages (_self، _self)؛
            Auto it = messages.find (msg_id)؛
            إذا (itr! = messages.end ()) {
                std :: string error = "msg_id موجود بالفعل:" + std :: to_string (msg_id)؛
                eosio_assert (false، error.c_str ())؛
            }
            messages.emplace (من ، [&] (auto & msg) {
                msg.msg_id = msg_id ؛
                msg.from = from؛
                msg.to = to؛
                msg.ciphertext = ciphertext؛
                msg.capsule = capsule؛
            })؛
        }
        //abi العمل
        باطل deletemsg (account_name إلى ، uint64_t msg_id) {
            require_auth (إلى) ؛
            messages_index messages (_self، _self)؛
            Auto it = messages.find (msg_id)؛
            إذا (itr == messages.end ()) {
                std :: string error = "msg_id غير موجود:" + std :: to_string (msg_id)؛
                eosio_assert (false، error.c_str ())؛
            }
            
            إذا (itr-> إلى! = إلى) {
                std :: string error = "Receipient not correct:" + eosio :: name {itr-> to} .to_string ()؛
                eosio_assert (false، error.c_str ())؛
            }
          
            messages.erase (بالميدان)؛
         }
    نشر:
        // @ رسائل جدول أبي i64
        هيكلة الرسائل
            msg_id؛
            اسم الحساب من ؛
            account_name إلى ؛
            الأمراض المنقولة جنسيا :: سلسلة تشفير؛
            الأمراض المنقولة جنسيا :: سلسلة كبسولة.
            uint64_t primary_key () const {return msg_id؛}
        }؛
        
        typedef eosio :: multi_index  messages_index؛
EOSIO_ABI (قائمة الانتظار ، (sendmsg) (deletemsg))

تجميعها:

eosiocpp -o queue.wast queue.cpp
eosiocpp -g queue.abi queue.cpp

قم بإنشاء حساب لتحميل العقد الذكي:

$ cleos إنشاء حساب eosio قائمة انتظار EOS5aEqZf22dfThTR8GGMnD8oFvsyzssQnhawNwPzfPv4fwDWhf7H
المعاملة المنفذة: a767af2c66857 ... 200 بايت 3309 لنا
# eosio <= eosio :: newaccount {"creator": "eosio" ، "name": "قائمة الانتظار" ، "owner": {"العتبة": 1 ، "keys": [{"key": "EOS5aEqZf22dfThTR8GGMnD8oFv .. .
cleos $ تعيين قائمة انتظار العقد .. /que
قراءة WAST / WASM من .. / قائمة الانتظار / قائمة الانتظار.
باستخدام WASM المجمعة بالفعل ...
عقد النشر ...
المعاملة المنفذة: 38e94741c ... 13824 بايت 9561 لنا
# eosio <= eosio :: setcode {"account": "قائمة الانتظار" ، "vmtype": 0 ، "vmversion": 0 ، "code": "00617ee7e ...
# eosio <= eosio :: setabi {"account": "queue" ، "abi": "0e656f73696f3a3a6162692f9640675 ...

إنشاء حسابات اختبار أليس و bob:

$ cleos إنشاء حساب eosio alice EOS6NU3XEvosgRVEbhrBHrkbYVteW7DDVewhjo9jgiYoSqUZamnZe
المعاملة المنفذة: f0c42065f6d9fc ... 200 بايت 243 لنا
# eosio <= eosio :: newaccount {"creator": "eosio"، "name": "alice"، "owner": {"threshold": 1، "keys": [{"key": "EOS6NU3XEvosgRVEbhrBHrkbYVt .. .
$ cleos إنشاء حساب eosio bob EOS7cX17CZ8V7yFobaVejAN7sMG39iiC5BmFk7b1NB1NNYcrEu1Go
المعاملة المنفذة: 51d45916fa252e ... 200 بايت 194 لنا
# eosio <= eosio :: newaccount {"creator": "eosio" ، "name": "bob" ، "owner": {"العتبة": 1 ، "keys": [{"key": "EOS7cX17CZ8V7yFobaVejAN7sMG39 .. .

دعنا ننتقل لبناء عميل لتشفير / فك تشفير رسالة والتفاعل مع العقد الذكي.

  1. إنشاء مفتاح خاص والكتابة في ملف.
من التكوين استيراد umbral ، مفاتيح
config.set_default_curve (SECP256K1)
private_key = keys.UmbralPrivateKey.gen_key ()
f = open ('priv.key' ، 'wb')
f.write (private_key.to_bytes ())
f.close ()

2. بناء المحلل اللغوي

def create_parser ():
    محلل = argparse.ArgumentParser (description = 'messenger')
    parser.add_argument ('- ملف المفتاح الخاص' ، اكتب = str ، dest = 'private_key_file' ، مطلوب = خطأ ، مساعدة = 'المسار إلى ملف المفتاح الخاص.')
    parser.add_argument ('- send-msg-id' ، نوع = str ، dest = 'send_msg_id' ، مطلوب = خطأ ، مساعدة = 'إرسال رسالة ، msg_id')
    parser.add_argument ('- send-msg-from' ، نوع = str ، dest = 'send_msg_from' ، مطلوب = خطأ ، مساعدة = 'إرسال رسالة ، منها حساب EOS')
    parser.add_argument ('- send-msg-to' ، اكتب = str ، dest = 'send_msg_to' ، مطلوب = خطأ ، help = 'أرسل رسالة ، إلى حساب EOS')
    parser.add_argument ('- send-msg' ، اكتب = str ، dest = 'send_msg' ، مطلوب = False ، help = 'Message to be send')
    parser.add_argument ('- read-msg-to' ، اكتب = str ، dest = 'read_msg_to' ، مطلوب = False ، help = 'اقرأ رسالة ، حساب EOS')
    محلل عودة
المحلل اللغوي = create_parser ()
args = parser.parse_args (argv)

3. قراءة من ملف المفتاح الخاص.

def read_privkey_file (privkey_file):
    إذا os.path.exists (privkey_file):
        مع open (privkey_file ، 'rb') كـ f:
            محاولة:
                المفتاح الخاص = f.read ()
            باستثناء استثناء كـ e:
                طباعة ("لا يمكن القراءة: {}". التنسيق (هـ))
                sys.exit (1)
            f.close ()
            عودة القطاع الخاص
    آخر:
        print ('لا يمكن العثور على الملف: {}'. format (privkey_file))
        sys.exit (1)

3. تشفير رسالة وإرسالها.

def send_msg (private_key_file ، msg ، send_msg_from ، send_msg_to ، send_msg_id):
    privkey_bytes = read_privkey_file (private_key_file)
    privkey = keys.UmbralPrivateKey.from_bytes (privkey_bytes)
    pubkey = privkey.get_pubkey ()
    نص عادي = msg.encode ()
    نص مشفر ، كبسولة = pre.encrypt (pubkey ، نص عادي)
    data = '{"from": "' + send_msg_from + '"، "to": "' + send_msg_to + '"، "msg_id": "' + send_msg_id + '"، "ciphertext": "' + ciphertext.hex () + '"،" capsule ":"' + capsule.to_bytes (). hex () + '"}'
    subprocess.call (['cleos'، 'push'، 'action'، DEFAULT_ACCOUNT، 'sendmsg'، data، '-p'، send_msg_from])

3. اقرأ من جدول الرسائل ، إذا كان يطابق read_msg_to ، فك تشفير رسالة ثم قم بحذفها.

def read_and_delete_msg (private_key_file ، read_msg_to):
    privkey_bytes = read_privkey_file (private_key_file)
    privkey = keys.UmbralPrivateKey.from_bytes (privkey_bytes)
    
    payload = '{"scope": "' + DEFAULT_ACCOUNT + '"، "code": "' + DEFAULT_ACCOUNT + '"، "table": "' + DEFAULT_TABLE + '"، "json": "true"}'
    استجابة =طلبات. طلب ​​("POST" ، DEFAULT_URL ، بيانات = حمولة)
    
    وجدت = خطأ
    لـ msg في response.json () ['rows']:
        إذا msg ['to'] == read_msg_to:
            نص مشفر = msg ['ciphertext']
            كبسولة = msg ['capsule']
            msg_id = msg ['msg_id']
            وجدت = صحيح
            استراحة
    ان وجد:
        capule = pre.Capsule.from_bytes (bytes.fromhex (capsule) ، privkey.params)
        نص واضح = pre.decrypt (
                          النص المشفر = bytes.fromhex (النص المشفر) ،
                          كبسولة = كبسولة ،
                          decrypting_key = المفتاح الخاص)
        طباعة ('نص واضح: {}'. تنسيق (نص واضح))
        طباعة ('حذف msg_id: {}'. format (msg_id))
        data = '{"to": "' + read_msg_to + '"، "msg_id": "' + str (msg_id) + '"}'
        subprocess.call (['cleos' ، 'push' ، 'action' ، DEFAULT_ACCOUNT ، 'deletemsg' ، بيانات ، '-p' ، read_msg_to])

4. القيم الافتراضية.

DEFAULT_ACCOUNT = 'قائمة الانتظار'
DEFAULT_TABLE = 'رسائل'
DEFAULT_URL = "http://127.0.0.1:8888/v1/chain/get_table_rows"

دعنا نختتمها ونختبرها!

$ python3 messenger.py - private-key-file priv.key - إرسال msg-id 1 - إرسال - msg - من أليس - إرسال - msg - إلى bob - إرسال - msg مرحبًا ، bob
المعاملة المنفذة: dfe17144e105c54d192 ... 392 بايت 648 لنا
# queue <= queue :: sendmsg {"from": "alice"، "to": "bob"، "msg_id": 1، "ciphertext": "8c53a656c9 ...

تحقق من جدول الرسائل.

cleos $ الحصول على قائمة انتظار قائمة انتظار الرسائل
{
  "الصفوف": [{
      "msg_id": 1 ،
      "من": "أليس" ،
      "إلى بوب"،
      "ciphertext": "8c8aa24196152b53da35d9fbf9e3c4d8e10f6b7153a656c9921cb440cc69a782c2ba0c2cf2"،
      "capsule": "028c4e8279c0919bdec4ea98b4251f15a74868d2ea7554ab796230af8f88e62cd9031c07e90c6183152e140c43a370f2c12526b6d62269f8672a8e6a6fc2bc6286c2bc6286c2bc2c6b2c7c2c6fc2c6286c2fc2bc6282c6bc2c6287
    }
  ]،
  "أكثر": خطأ
}

الرسالة المشفرة هناك. ثم دعونا نقرأها.

$ python3 messenger.py - خاص - مفتاح - ملف priv.key - قراءة - msg إلى bob
نص واضح: b'hello ، bob '
msg_id: 1
المعاملة المنفذة: 6cdad7694f3fe6c8 ... 112 بايت 566 لنا
# queue <= queue :: deletemsg {"to": "bob"، "msg_id": 1}

التحقق من جدول الرسائل ، ذهب الرسالة.

cleos $ الحصول على قائمة انتظار قائمة انتظار الرسائل
{
  "الصفوف": [] ،
  "أكثر": خطأ
}

وبالتالي استكشفنا كيفية تأمين الرسائل على EOS. للمضي قدمًا ، يمكننا العمل على السيناريو حيث يكون Alice و Bob يملكان مفاتيحهما الخاصة ، أو يرسلان إلى عدة مستخدمين.

اجتماعي لدينا

موقع الكتروني
تويتر
موقع يوتيوب
نلتقي
Steem