Teori struktur sistem tersembunyi

pengantar

Dimulai dengan kriptografi klasik, dari permulaannya hingga kelahirannya kembali menjadi kriptografi modern, selalu ada masalah dalam mentransfer kunci enkripsi antar subjek. Masalah ini sebagian terpecahkan pada paruh kedua abad ke-20, dengan munculnya bagian asimetris dari kriptografi, ketika serangan penyadapan menjadi tidak mungkin [1]. Meski demikian, masalah asli masih tetap ada dan dieksploitasi hingga saat ini, meski dalam bentuk terselubung.





Kendala yang menjadi solusi dari masalah terletak pada elemen kepercayaan, ada dan tidak adanya. Jika Anda tidak mengambil tindakan apa pun untuk membangun koneksi tepercaya, maka koneksi apa pun secara apriori akan terkena serangan MITM (man in the middle). Di sisi lain, jika Anda membuat koneksi tepercaya, kemungkinan serangan MITM tidak hilang, tetapi berkurang. Dan sekarang, bersama dengan subjek aslinya, ada subjek perantara, interstisial (server, node untuk menyimpan dan mengirimkan informasi), dipilih oleh kami, dan merupakan penyerang yang didirikan secara hukum. Hanya dengan membatasi jangkauan serangan, mereka tidak berhenti berpotensi menyerang. Node ini mengetahui semua informasi yang dikirimkan oleh kami dan kepada kami: hobi, minat, hobi, hiburan, pesan. Selanjutnya, informasi (objek) ini, seperti yang sering terjadi,mulai berubah menjadi periklanan, atas dasar itu modal dari semua entitas perantara yang sama meningkat. Akibatnya, seluruh masalah benar-benar terbalik, dan sekarang, alih-alih mencari koneksi untuk menguping, penyerang menciptakannya sendiri, dia sendiri menjadi dasar untuk mendengarkan dalam kedok server, dan orang-orang, pada gilirannya. , hanya memilih wajah orang yang ada di belakang mereka akan diawasi dengan ketat.





Tidak mungkin untuk menghancurkan sistem kepercayaan seperti itu karena munculnya jenis serangan yang lebih umum dan merusak, serta karena ketidakmungkinan untuk sepenuhnya menghapus kepercayaan seperti itu [2, p.267]. Jadi, yang tersisa hanyalah memperbaiki sistem ini, membuatnya sehingga mekanismenya sendiri cenderung mengurangi kekuatan kepercayaan *, sehingga strukturnya sendiri akan mewakili perlindungan objek dan subjek anonim. Sistem semacam ini mencakup jaringan anonim dan saluran komunikasi rahasia.





Kekuatan kepercayaan

* — , , . , , , , , . , , , . . , - . , , , , . , (-, ), , .





, , – , . , , – , , , . /, . , .





, , (, ). , , , . , .





, , . ( - ) , , . , . , . , , , , .





, , . , . : , . “ ” ( ), - . , . “ ” ( ), . , “” , (-) .





, . , , / . , . , / , , , , . , .





- , , , , . (2,3,4,5,6 ).





  1. |A| = 0*. .





  2. -, -. , (, IP-, , ). . , , , , - . , , |A| = 1. -.





  3. , , - . , , , lim|A|→C, C - - . , . , ( ) - , - , .





  4. . , , , , , . , , ( ) . , , , [3] .., ( , ). , , , , , , - , [4, .398]. , , , . , ( ) () () . , - 0 < |A| ≤ N, N - . , , , .





  5. , , . . , lim|A|→C, C - . , Tor ( ), I2P ( ) ..





  6. , , , ( ) . , , . 0 < |A| ≤ N(C+1), N - , C - . , , . , , , .





, , , , , , - .





, , , [5, .223]. , , , , , . , . , , . , .





, , ( ), , , ( ). , , ( , ) . , , . , , , , , (lim|A|→1) . , , , , . , , . , . , . , . , , . :





  1. . , . , , , , , . -- ( friend-to-friend), — . , , , . , , - , - . , , , , , , . friend-to-friend (f2f) , , , .





  2. — . , , , () / (). , - , , . , . O(N) . , , N , N-1 . (TTL) , , , , .





, , , . , . , , , , , . , . , , :





  1. — , . , . , . , , , .





  2. . , - . , , A B, A**. Tor, , “”, .





. , , . , . , , , . , . , . , , , — , “” . , , . , , - -.





[6]
import (
	"bytes"
)
func RoutePackage(sender *PrivateKey, receiver *PublicKey, data []byte, route []*PublicKey) *Package { 
  var ( 
    rpack = Encrypt(sender, receiver, data) 
    psender = GenerateKey(N) 
  ) 
  for _, pub := range route { 
    rpack = Encrypt( 
      psender, 
      pub, 
      bytes.Join(
        [][]byte{
          ROUTE_MODE, 
          SerializePackage(rpack),
        },
        []byte{},
      ),
    )
  } 
  return rpack 
}
      
      



, {A, B, C} ( — A) , , ( , ). , , , , , . , , , : (A → B A → C) → (B → C C → B) → (B → A C → A), , : (A → B A → C) → (B → A C → A)***. , (), . , ( , ), ( , ). , , , , , : (1) - (1) - (2) (1) - (1) - (1). , ( ), (2) (2), . , ( ) k n ( n = 2), (k, 2) = 2 ( — ), , k = 2, : (A → B A → C) → (B → C C → B) → (B → C C → B) → (B → A C → A). , : (1) - (1) - (2) - (2) (1) - (1) - (~1) - (1), . , (1) = (1), (2) = (1), (2) = (~1). (1), , . - , . , (3) = (2), .





, , , , . , , - , - , - - . , . , :





  1. . , , . , . , , .





  2. . , , , , , . , .





, , , , ( ). T, (2+k, 2) ( - ), , k = 2 4. , , , ( ). , , , , . :





  1. k ( , ).





  2. k [1;n], n < N ( ).





* — , , , . , ( ). , ( ).





** — , , . , , . .





*** , , , .





, , - , , , . , , , , - . , :





  1. , , - , / [7] . , , (, ), (). (), .





  2. , , , , . , , . , . , , , . ( |A| = 1), . , , . , , , , . - — ( ).





, , , . , , , . , , , , . , -, -, , , . , . , ( , ) 2MiB, 256KiB.





, , . , , , . , , (, ..), , . , , , . , , .





, , , . , , . , ( , , ), , .





, , , , , [8, .720]. , , , , , . , , , . , - , .





, , ( ), , ( ), ( ) ( , ).





, , , , . [2, .58][8, .80].





. , , , , , .





, . , , . . . .





, , , , , , - , . , , ( , ) .





import ( 
  "bytes" 
  "encoding/hex" 
) 
func Encrypt(sender *PrivateKey, receiver *PublicKey, data []byte) *Package { 
  var ( 
    session = GenerateBytes(N) 
    rand = GenerateBytes(M) 
    pubsend = PublicKeyToBytes(&sender.PublicKey) 
    hash = HashSum(bytes.Join( 
      [][]byte{ 
        rand, 
        data,pubsend, 
        PublicKeyToBytes(receiver), 
      }, 
      []byte{}, 
    )) 
    sign = Sign(sender, hash) 
  ) 
  return &Package{ 
    Head: HeadPackage{ 
      Rand: hex.EncodeToString(EncryptS(session, rand)), 
      Sender: hex.EncodeToString(EncryptS(session, pubsend)), 
      Session: hex.EncodeToString(EncryptA(receiver, session)), 
    }, Body: BodyPackage{ 
      Data: hex.EncodeToString(EncryptS(session, data)), 
      Hash: hex.EncodeToString(hash), 
      Sign: hex.EncodeToString(EncryptS(session, sign)), 
      Npow: ProofOfWork(hash, C), 
    }, 
  } 
}
      
      



, , ( ) . , .





() , , , .





import ( 
  "bytes" 
  "encoding/hex" 
) 
func Decrypt(receiver *PrivateKey, pack *Package) (*PublicKey, []byte) { 
  // Check proof. 
  hash, err := hex.DecodeString(pack.Body.Hash) 
  if err != nil { 
    return nil, nil 
  } 
  if !ProofIsValid(hash, C, pack.Body.Npow) { 
    return nil, nil 
  } 
  // Decrypt session key. 
  eskey, err := hex.DecodeString(pack.Head.Session) 
  if err != nil { 
    return nil, nil 
  } 
  skey := DecryptA(receiver, eskey) 
  if skey == nil { 
    return nil, nil 
  } 
  // Decrypt public key.
  ebpubsend, err := hex.DecodeString(pack.Head.Sender) 
  if err != nil { 
    return nil, nil 
  } 
  bpubsend := DecryptS(skey, ebpubsend) 
  if bpubsend == nil { 
    return nil, nil 
  } 
  pubsend := BytesToPublicKey(bpubsend) 
  if pubsend == nil { 
    return nil, nil 
  } 
  // Decrypt and check sign. 
  esign, err := hex.DecodeString(pack.Body.Sign) 
  if err != nil { 
    return nil, nil 
  } 
  sign := DecryptS(skey, esign) 
  if sign == nil { 
    return nil, nil 
  } 
  if !Verify(pubsend, hash, sign) { 
    return nil, nil 
  } 
  // Decrypt rand. 
  erand, err := hex.DecodeString(pack.Head.Rand) 
  if err != nil { 
    return nil, nil 
  }
  rand := DecryptS(skey, erand) 
  if rand == nil { 
    return nil, nil 
  } 
  // Decrypt data. 
  edata, err := hex.DecodeString(pack.Body.Data) 
  if err != nil { 
    return nil, nil 
  } 
  data := DecryptS(skey, edata) 
  if data == nil { 
    return nil, nil 
  } 
  // Check hash. 
  check := HashSum(bytes.Join( 
    [][]byte{ 
      rand, 
      data, 
      PublicKeyToBytes(pubsend), 
      PublicKeyToBytes(&receiver.PublicKey), 
    }, 
    []byte{}, 
  )) 
  if !bytes.Equal(hash, check) { 
    return nil, nil 
  } 
  return pubsend, data 
}
      
      



, , , , ( ), n- , i- . , ⎡M/nN⎤+1 , M - , N - . , , .





gopeer: https://github.com/Number571/gopeer





- HES, : https://github.com/Number571/HES





, ( , ), , ( ) ( ). , . . , , . , , (, ), (, ) ( , ). ( ), .





  1. . ., . . [ ]. — : https://ee.stanford.edu/~hellman/publications/24.pdf ( : 19.12.2020).





  2. , ., , . . / . , . . . - .: «, 2005. - 420 .





  3. , . : [ ]. — : https://bitcoin.org/files/bitcoin-paper/bitcoin_ru.pdf ( : 19.12.2020).





  4. , ., , . / . , . . — .: , 2017. - 960 .





  5. , . ., , . . / . . , . . . - .: - , 2019. - 300 .





  6. Donovan, A.A., Kernighan, B.U. Pergi bahasa pemrograman / A.A. Donovan, B.U. Kernighan. - M .: OOO "I.D. Williams ", 2018. - 432 hal.





  7. Shelukhin, O. I., Kanaev, S. D. Steganografi. Algoritma dan implementasi perangkat lunak / O.I. Shelukhin, S.D. Kanaev. - M .: Hotline - Telecom, 2018. - 592 hal.





  8. Schneier, B. Kriptografi Terapan. Protokol, algoritma dan kode sumber di C / B. Schneier. - SPB.: OOO "Alfa-kniga", 2018. - 1040 hal.








All Articles