前書き
古典的な暗号化から始まり、その開始から現代の暗号化への再生まで、サブジェクト間で暗号化キーを転送するという問題が常にありました。この問題は、盗聴攻撃が不可能になった20世紀後半に暗号化の非対称セクションが出現したことで部分的に解決されました[1]。それにもかかわらず、元の問題はまだ残っており、ベールに包まれた形ではありますが、今日まで悪用されています。
問題の解決に向けられた障害は、信頼の要素、その存在と不在にあります。信頼できる接続を確立するための対策を講じない場合、接続は事前にMITM(中間者)攻撃の対象になります。一方、信頼できる接続を確立すると、MITM攻撃の可能性はなくなりませんが、減少します。そして今、元のサブジェクトに加えて、私たちが選択した中間の侵入型サブジェクト(サーバー、情報を保存および送信するためのノード)があり、法的に確立された攻撃者です。攻撃の範囲を制限することによってのみ、潜在的な攻撃を停止することはありません。これらのノードは、趣味、興味、趣味、娯楽、メッセージなど、私たちと私たちに送信されるすべての情報を知っています。さらに、この情報(オブジェクト)は、よくあることですが、広告への変換を開始し、それに基づいてすべての同じ中間エンティティの資本が増加します。その結果、問題全体が完全に逆さまになり、盗聴の接続を探す代わりに、攻撃者が自分で作成し、サーバーを装って自分自身がリスニングの基盤になります。 、後ろにいる人の顔だけを選んで注意深く見守っていきます。
より一般的で破壊的なタイプの攻撃が出現し、信頼を完全に根絶することが不可能であるため、このような信頼システムを破壊することはできません[2、p.267]。したがって、残っているのは、このシステムを改善し、そのメカニズム自体が信頼の力を低下させる傾向があるようにすることです*。これにより、独自の構造がオブジェクトと匿名のサブジェクトの保護を表します。この種のシステムには、匿名ネットワークと秘密の通信チャネルが含まれます。
信頼の力
* — , , . , , , , , . , , , . . , - . , , , , . , (-, ), , .
, , – , . , , – , , , . /, . , .
, , (, ). , , , . , .
, , . ( - ) , , . , . , . , , , , .
, , . , . : , . “ ” ( ), - . , . “ ” ( ), . , “” , (-) .
, . , , / . , . , / , , , , . , .
- , , , , . (2,3,4,5,6 ).
|A| = 0*. .
-, -. , (, IP-, , ). . , , , , - . , , |A| = 1. -.
, , - . , , , lim|A|→C, C - - . , . , ( ) - , - , .
. , , , , , . , , ( ) . , , , [3] .., ( , ). , , , , , , - , [4, .398]. , , , . , ( ) () () . , - 0 < |A| ≤ N, N - . , , , .
, , . . , lim|A|→C, C - . , Tor ( ), I2P ( ) ..
, , , ( ) . , , . 0 < |A| ≤ N(C+1), N - , C - . , , . , , , .
, , , , , , - .
, , , [5, .223]. , , , , , . , . , , . , .
, , ( ), , , ( ). , , ( , ) . , , . , , , , , (lim|A|→1) . , , , , . , , . , . , . , . , , . :
. , . , , , , , . -- ( friend-to-friend), — . , , , . , , - , - . , , , , , , . friend-to-friend (f2f) , , , .
— . , , , () / (). , - , , . , . O(N) . , , N , N-1 . (TTL) , , , , .
, , , . , . , , , , , . , . , , :
— , . , . , . , , , .
. , - . , , 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), .
, , , , . , , - , - , - - . , . , :
. , , . , . , , .
. , , , , , . , .
, , , , ( ). T, (2+k, 2) ( - ), , k = 2 4. , , , ( ). , , , , . :
k ( , ).
k [1;n], n < N ( ).
* — , , , . , ( ). , ( ).
** — , , . , , . .
*** , , , .
, , - , , , . , , , , - . , :
, , - , / [7] . , , (, ), (). (), .
, , , , . , , . , . , , , . ( |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 - . , , .
, ( , ), , ( ) ( ). , . . , , . , , (, ), (, ) ( , ). ( ), .
. ., . . [ ]. — : https://ee.stanford.edu/~hellman/publications/24.pdf ( : 19.12.2020).
, ., , . . / . , . . . - .: «, 2005. - 420 .
, . : [ ]. — : https://bitcoin.org/files/bitcoin-paper/bitcoin_ru.pdf ( : 19.12.2020).
, ., , . / . , . . — .: , 2017. - 960 .
, . ., , . . / . . , . . . - .: - , 2019. - 300 .
Donovan、A.A.、Kernighan、B.U。プログラミング言語に行く/A.A。ドノバン、B.U。カーニハン。--M。:OOO "I.D. ウィリアムズ」、2018年。-432ページ。
Shelukhin、O。I.、Kanaev、S。D. ステガノグラフィ。アルゴリズムとソフトウェアの実装/O.I。Shelukhin、S.D。カナエフ。-M 。:ホットライン-テレコム、2018 .-- 592p。
シュナイアー、B。応用暗号化。C / B. Schneierのプロトコル、アルゴリズム、ソースコード。--SPB。:OOO "Alfa-kniga"、2018.-1040p。