ເອກະສານ Shadowsocks
Navigation
AEAD
AEAD ຫຍໍ້ມາຈາກ Authenticated Encryption with Associated Data. ເຄື່ອງເຂົ້າລະຫັດ AEAD ພ້ອມໆກັນໃຫ້ຄວາມລັບ, ຄວາມຊື່ສັດ, ແລະຄວາມຖືກຕ້ອງ. ພວກເຂົາເຈົ້າມີປະສິດທິພາບທີ່ດີເລີດແລະປະສິດທິພາບພະລັງງານໃນຮາດແວທີ່ທັນສະໄຫມ. ຜູ້ໃຊ້ຄວນໃຊ້ລະຫັດ AEAD ທຸກຄັ້ງທີ່ເປັນໄປໄດ້.
ແນະນໍາການເຂົ້າລະຫັດ AEAD ຕໍ່ໄປນີ້. ການປະຕິບັດ Shadowsocks ທີ່ສອດຄ້ອງກັນຕ້ອງຮອງຮັບ AEAD_CHACHA20_POLY1305. ການປະຕິບັດສໍາລັບອຸປະກອນທີ່ມີຮາດແວ AES ເລັ່ງຄວນປະຕິບັດ AEAD_AES_128_GCM ແລະ AEAD_AES_256_GCM.
ຊື່ | Alias | ຂະໜາດກະແຈ | ຂະຫນາດເກືອ | Nonce Size | Tag ຂະຫນາດ |
AEAD_CHACHA20_POLY1305 | chacha20-ietf-poly1305 | 32 | 32 | 12 | 16 |
AEAD_AES_256_GCM | aes-256-gcm | 32 | 32 | 12 | 16 |
AEAD_AES_128_GCM | aes-128-gcm | 16 | 16 | 12 | 16 |
ກະລຸນາເບິ່ງ ການລົງທະບຽນ IANA AEAD ສໍາລັບໂຄງການຕັ້ງຊື່ແລະສະເພາະ.
ການຜັນແປຫຼັກ
ລະຫັດຫຼັກສາມາດຖືກປ້ອນໂດຍກົງຈາກຜູ້ໃຊ້ ຫຼືສ້າງຈາກລະຫັດຜ່ານ.
HKDF_SHA1 ເປັນຟັງຊັນທີ່ເອົາກະແຈລັບ, ເກືອທີ່ບໍ່ລັບ, ສາຍຂໍ້ມູນ, ແລະຜະລິດລະຫັດຍ່ອຍທີ່ມີລະຫັດລັບທີ່ເຂັ້ມແຂງເຖິງແມ່ນວ່າລະຫັດລັບທີ່ປ້ອນເຂົ້າຈະອ່ອນແອ.
HKDF_SHA1(ກະແຈ, ເກືອ, ຂໍ້ມູນ) => ປຸ່ມຍ່ອຍ
ສະຕຣິງຂໍ້ມູນຜູກມັດກະແຈຍ່ອຍທີ່ສ້າງຂຶ້ນໃສ່ກັບບໍລິບົດສະເພາະຂອງແອັບພລິເຄຊັນ. ໃນກໍລະນີຂອງພວກເຮົາ, ມັນຈະຕ້ອງເປັນສະຕຣິງ "ss-subkey" ໂດຍບໍ່ມີການວົງຢືມ.
ພວກເຮົາໄດ້ຮັບກະແຈຍ່ອຍຕໍ່ເຊຊັນຈາກລະຫັດຕົ້ນສະບັບທີ່ແບ່ງປັນກ່ອນການນໍາໃຊ້ HKDF_SHA1. ເກືອຕ້ອງເປັນເອກະລັກຕະຫຼອດຊີວິດຂອງລະຫັດຕົ້ນສະບັບທີ່ແບ່ງປັນກ່ອນ.
ການເຂົ້າລະຫັດ/ຖອດລະຫັດທີ່ຮັບຮອງຄວາມຖືກຕ້ອງ
AE_encrypt ເປັນຟັງຊັນທີ່ເອົາລະຫັດລັບ, ຂໍ້ຄວາມທີ່ບໍ່ແມ່ນຄວາມລັບ, ຂໍ້ຄວາມ, ແລະຜະລິດລະຫັດລັບ ແລະແທັກການຢືນຢັນ. Nonce ຈະຕ້ອງບໍ່ຊໍ້າກັນສຳລັບກະແຈທີ່ໃຫ້ໄວ້ໃນແຕ່ລະຄຳຮ້ອງ.
AE_encrypt(key, nonce, message) => (ລະຫັດ, ແທັກ)
AE_decrypt ເປັນຟັງຊັນທີ່ເອົາລະຫັດລັບ, ບໍ່ແມ່ນຄວາມລັບ, ciphertext, ໂຄດຄໍາສັ່ງການກວດສອບ, ແລະຜະລິດຂໍ້ຄວາມຕົ້ນສະບັບ. ຖ້າການປ້ອນຂໍ້ມູນໃດໆຖືກລົບກວນ, ການຖອດລະຫັດຈະລົ້ມເຫລວ.
AE_decrypt(key, nonce, ciphertext, tag) => ຂໍ້ຄວາມ
TCP
ກະແສ TCP ທີ່ຖືກເຂົ້າລະຫັດ AEAD ເລີ່ມຕົ້ນດ້ວຍເກືອທີ່ສ້າງຂຶ້ນແບບສຸ່ມເພື່ອເອົາກະແຈຍ່ອຍຕໍ່ເຊສຊັນ, ຕິດຕາມດ້ວຍຊຸດທີ່ເຂົ້າລະຫັດໄວ້. ແຕ່ລະຊິ້ນມີໂຄງສ້າງດັ່ງຕໍ່ໄປນີ້:
[encrypted payload length][length tag][encrypted payload][payload tag]
ຄວາມຍາວຂອງ payload ແມ່ນຈຳນວນເຕັມທີ່ບໍ່ໄດ້ເຊັນ 2-byte big-endian ຈຳກັດຢູ່ທີ່ 0x3FFF. ສອງບິດທີ່ສູງກວ່າຈະຖືກສະຫງວນໄວ້ ແລະຕ້ອງຖືກຕັ້ງເປັນສູນ. ດັ່ງນັ້ນການໂຫຼດແມ່ນຈຳກັດຢູ່ທີ່ 16*1024 – 1 bytes.
ການປະຕິບັດການເຂົ້າລະຫັດ/ຖອດລະຫັດ AEAD ທໍາອິດໃຊ້ການນັບ nonce ເລີ່ມຈາກ 0. ຫຼັງຈາກແຕ່ລະການປະຕິບັດການເຂົ້າລະຫັດ/ຖອດລະຫັດ, nonce ຈະຖືກເພີ່ມຂຶ້ນໂດຍອັນໜຶ່ງຄືກັບວ່າມັນເປັນຈຳນວນເຕັມທີ່ບໍ່ໄດ້ເຊັນ. ໃຫ້ສັງເກດວ່າແຕ່ລະ TCP chunk ກ່ຽວຂ້ອງກັບການປະຕິບັດການເຂົ້າລະຫັດ / ຖອດລະຫັດ AEAD ສອງອັນ: ຫນຶ່ງສໍາລັບຄວາມຍາວ payload, ແລະຫນຶ່ງສໍາລັບ payload. ດັ່ງນັ້ນແຕ່ລະ chunk ເພີ່ມຂຶ້ນ nonce ສອງເທື່ອ.
TCP
ກະແສ TCP ທີ່ຖືກເຂົ້າລະຫັດ AEAD ເລີ່ມຕົ້ນດ້ວຍເກືອທີ່ສ້າງຂຶ້ນແບບສຸ່ມເພື່ອເອົາກະແຈຍ່ອຍຕໍ່ເຊສຊັນ, ຕິດຕາມດ້ວຍຊຸດທີ່ເຂົ້າລະຫັດໄວ້. ແຕ່ລະຊິ້ນມີໂຄງສ້າງດັ່ງຕໍ່ໄປນີ້:
[encrypted payload length][length tag][encrypted payload][payload tag]
ຄວາມຍາວຂອງ payload ແມ່ນຈຳນວນເຕັມທີ່ບໍ່ໄດ້ເຊັນ 2-byte big-endian ຈຳກັດຢູ່ທີ່ 0x3FFF. ສອງບິດທີ່ສູງກວ່າຈະຖືກສະຫງວນໄວ້ ແລະຕ້ອງຖືກຕັ້ງເປັນສູນ. ດັ່ງນັ້ນການໂຫຼດແມ່ນຈຳກັດຢູ່ທີ່ 16*1024 – 1 bytes.
ການປະຕິບັດການເຂົ້າລະຫັດ/ຖອດລະຫັດ AEAD ທໍາອິດໃຊ້ການນັບ nonce ເລີ່ມຈາກ 0. ຫຼັງຈາກແຕ່ລະການປະຕິບັດການເຂົ້າລະຫັດ/ຖອດລະຫັດ, nonce ຈະຖືກເພີ່ມຂຶ້ນໂດຍອັນໜຶ່ງຄືກັບວ່າມັນເປັນຈຳນວນເຕັມທີ່ບໍ່ໄດ້ເຊັນ. ໃຫ້ສັງເກດວ່າແຕ່ລະ TCP chunk ກ່ຽວຂ້ອງກັບການປະຕິບັດການເຂົ້າລະຫັດ / ຖອດລະຫັດ AEAD ສອງອັນ: ຫນຶ່ງສໍາລັບຄວາມຍາວ payload, ແລະຫນຶ່ງສໍາລັບ payload. ດັ່ງນັ້ນແຕ່ລະ chunk ເພີ່ມຂຶ້ນ nonce ສອງເທື່ອ.