Score:1

Camellia 1.2.0: คำที่มี 0 ที่ตารางคีย์

ธง co

ทดสอบโค้ดที่ใช้ Camellia 1.2.0 รหัสแหล่งที่มาเมื่อสร้าง keyTable จากคีย์อินพุต ให้ใช้:

เป็นโมฆะ Camellia_Ekeygen (const int keyBitLength, 
          const ถ่านที่ไม่ได้ลงนาม * rawKey 
          ตารางคีย์คีย์ KEY_TABLE_TYPE)

ผลลัพธ์แสดงคำ 'ศูนย์' สองสามคำในที่เดียวกัน ตัวอย่างสุ่มสองตัวอย่างสำหรับ 256 บิต:

E1AE67E4 07AE952B 94B0FCD1 CD366E1C 5160F1A8 45893AE8 0994EC20 1B5782AF

52027468 D2CEEB8F 00000000 00000000 5A44D15D 533F0EF8 E441183F 960616CE
B492E69C C71899DB 1C149A9E DA2EF3F9 C590DF1D 8ECE1AA3 5BF4C76A 517A719B
BA4E6211 083B6502 ABE0D506 6A3C58D4 32B152A6 C7D2AD48 2338FC75 4B1C4805
6FB9B4E4 4E14DA25 46CEF6AA D655F3C1 E89A9073 87CCF090 098D9E8F C73283B7
CD0F4BB9 E166D31C 7EE61ACE 52E97A40 0F5B9E82 4F98AEDE 91D08211 2E660D02
01506F57 40F9E4BA C2AB1164 196A9DE8 6E870140 C0A16094 F462E486 D98FF34F
F8543532 5ACAA32E 0046EFC7 06E9A0B9 42409189 9D9C0A16 EF580EC8 03E52B67
4D99620A B6A40197 3999A1B9 A9B45F27 6AE83BF0 7351AF36 6AEDF2EC 0A050076
B50EBD28 B9A2B34C 00000000 00000000


BE276A07 021C223F 40262C4B 2B07D216 AB51C522 C919C184 BBAD4565 B3050C87

93759D00 1DCE4C1F 00000000 00000000 91C6EBE1 47BE73E0 A1ECCAB9 B997E1E5
DEB11931 C13C15D2 EA9E2B5B 892BC368 BFD5F521 7B61B763 CB8C58B7 0AE271F1
617046B2 5951EB2E 2143C16C 4871D4EA 8AA8E801 3CD1E79E D64B23F5 DA983076
D6232073 5364BDE7 77FFE6AE B967FDE4 FDD26694 1720ECF0 6FC56EEE 3B618822
C46202F4 217DB0B2 A076E26B 23C22170 AD07C5E8 890AE608 EFC78526 F0F62449
7C712F1A D7CC710B C0FDB367 E97D2186 437CA739 F93D0CBF C90FF6E2 C879AA2B
511B3CF8 2E25C89E 7B745E74 CA705CCE 3DFD612D 1BE56472 FA45E7EA 4B3B85B0
95F84DCF 4C14FC95 20310BF7 A353A328 0E505958 A56CB1A1 007D2357 CC0239C8
4EFF9C31 2B9BEF19 00000000 00000000

เป็นที่คาดหวัง?

คำชี้แจง: การทิ้ง "ฐานสิบหก" ด้านบนแสดงการเรียกใช้ฟังก์ชันสองครั้ง สำหรับแต่ละคีย์BitLength ถูกตั้งค่าเป็น 256 ลำดับที่สั้นกว่า (ซึ่งพอดีกับหนึ่งบรรทัด) คือคีย์สุ่ม 256 บิต และสิ่งที่ตามมาคือเอาต์พุตของฟังก์ชัน (คัดลอกไปยังบัฟเฟอร์ keyTable)

การทดสอบอื่น: ฉันตั้งค่า keyTable เป็นศูนย์ก่อนที่จะเรียกใช้ฟังก์ชัน ตอนนี้ฉันได้ตั้งค่าไบต์ทั้งหมดเป็น 0xFF และคำที่เป็นศูนย์กลายเป็น: 0xFFFFFFFF น่ากลัว. คำเหล่านี้ (คำเดียวกันเสมอ) ไม่ได้ถูกแตะต้องโดยฟังก์ชัน

พยายามแก้ไขโดยใช้ประเภทมาตรฐาน ฉันได้เปลี่ยนเป็นการรวบรวม -O0 เพื่อหลีกเลี่ยงปัญหาการปรับให้เหมาะสม:

//typedef int ที่ไม่ได้ลงชื่อ KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN];
/* u32 ต้องเป็นคำ 32 บิต */
//typedef unsigned int u32;
//typedef ถ่านที่ไม่ได้ลงชื่อ u8;

#include <stdint.h> // นี่เป็นเพียงการเปลี่ยนแปลงโค้ดเดิมเท่านั้น (เก็บไว้ด้านบน):
พิมพ์ def uint32_t KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN];
พิมพ์ def uint32_t u32;
typedef uint8_t u8;

ฉันได้อัปโหลดโปรแกรมทดสอบขั้นต่ำแล้ว ที่นี่.

DannyNiu avatar
vu flag
ซอร์สโค้ดที่ถือว่า 'long' เป็น 32 บิต ซึ่งอาจไม่จริงสำหรับระบบ 64 บิต ลองแทนที่คำจำกัดความประเภทสำหรับ "Word" ด้วย "uint32_t" ที่จุดเริ่มต้นของซอร์สโค้ด
devnull avatar
co flag
@แดนนี่นิว ขอบคุณ. ฉันได้ลองแล้วและอัปเดตคำถาม (ไม่มีการเปลี่ยนแปลง) ฉันได้ดาวน์โหลดซอร์สอีกครั้งและแยกโปรแกรมทดสอบ "ขั้นต่ำ" ซึ่งทำซ้ำได้สำหรับฉัน (โค้ด 687 บรรทัด) ฉันควรอัปโหลดที่นี่หรือไม่
Maarten Bodewes avatar
in flag
อาจมากไปหน่อย แต่แน่นอนว่าคุณอาจวางไว้ในที่ที่อนุญาตให้ใช้ข้อมูลโค้ดและใส่ลิงก์ในคำถามโดยส่วนตัวแล้ว ฉันจะลองใช้โค้ดอื่นที่คอมไพล์ง่าย (เช่น Bouncy Castle / Java) จากนั้นลองตรวจสอบค่าที่คุณสร้างขึ้น ความแตกต่าง เช่น ค่าทั้งหมดเป็นศูนย์ ฯลฯ ควรมองเห็นได้ง่าย
Maarten Bodewes avatar
in flag
เอ่อ สำหรับทุกคนที่ไปเส้นทางนั้น BC ระบุ RFC 3713 ฉันไม่ได้รับค่าเดียวกันเลย ฉันเดาว่าค่าหนึ่งคือ v1 และอีกค่าหนึ่งคือ v2 ของรหัส Camelia เฮ้อ นั่นเหมาะกับคำถามอื่นที่ฉันคิดว่า
devnull avatar
co flag
@MaartenBodewes ฉันเพิ่งดาวน์โหลดเวอร์ชัน x86_64 asm จากหน้าเดียวกัน (ลิงก์แรกที่ด้านบน) และสร้าง keyTable ที่แตกต่างไปจากเดิมอย่างสิ้นเชิง (โดยไม่มีคำที่ไม่ได้ใช้ 4 คำ) ฉันได้ส่งอีเมลไปยังที่อยู่ติดต่อในหน้าเดียวกัน และจะรายงานคำตอบที่เกี่ยวข้องที่นี่
Maarten Bodewes avatar
in flag
ฉันหวังว่าคุณจะได้รับคำตอบ บางครั้งก็ยากที่จะได้รับคำตอบจากประเทศญี่ปุ่น :)
devnull avatar
co flag
@มาร์เท่น โบเดเวส ตามที่คุณบอก ไม่มีคำตอบฉันกำลังเขียนคำตอบเพื่อจัดทำเอกสารนี้เนื่องจากข้อผิดพลาดชัดเจนแล้วโดยการตรวจสอบโค้ด
Score:1
ธง co

ในขณะที่ NTT ตรวจสอบสิ่งนี้ ฉันกำลังโพสต์สิ่งนี้เป็น "วิธีแก้ปัญหา":

โดยการตรวจสอบการทำงาน

เป็นโมฆะ camellia_setup256 (const char * คีย์ที่ไม่ได้ลงนาม, u32 * คีย์ย่อย)

เป็นที่ชัดเจนว่าการเข้าถึง 'คีย์ย่อย' ของเวกเตอร์เอาต์พุตทั้งหมดนั้นดำเนินการโดยใช้มาโคร

#define CamelliaSubkeyL(INDEX) (คีย์ย่อย[(INDEX)*2])
#define CamelliaSubkeyR(INDEX) (คีย์ย่อย[(INDEX)*2 + 1])

ไม่มีที่ไหนเลยในฟังก์ชันที่มีการอ้างอิงถึงดัชนี 1 และ 33 ที่จะพบ ดัชนีเหล่านี้จะเขียนถึงตำแหน่งคำที่ 2, 3, 66 และ 67 ซึ่งเป็นคำทั้ง 4 คำที่ไม่ได้เขียนไว้ในแบบทดสอบ

พอร์ต OpenSSL ของ Camellia cipher (Apache License 2.0) ไม่มีปัญหานี้: การประกอบ และ มีอยู่.

อัปเดต:

ฉันได้เปรียบเทียบสองพอร์ตข้างต้นกับรหัสจาก NTT ที่เชื่อมโยงในคำถามดังนี้:

  1. สร้างคีย์สุ่ม 256 บิต
  2. สร้างบล็อกสุ่ม 16 ไบต์
  3. ด้วยการนำไปใช้งาน 3 รายการเข้ารหัสบล็อกเพื่อเปรียบเทียบข้อความเข้ารหัส

สรุป: แม้จะมีคำที่ไม่ได้ใช้ใน keyTable สำหรับการนำ NTT ไปใช้งาน แต่ในคู่คีย์/บล็อกทั้งหมดหลายล้านคู่ที่ทดสอบ ข้อความไซเฟอร์เท็กซ์ทั้งหมดที่เกิดจากการนำไปใช้งาน 3 รายการก็ตรงกัน

แก้ไข:

เนื่องจากไม่มีผลกับการเข้ารหัส/ถอดรหัส การแก้ไขจะลดขนาดคีย์ตารางจาก 68 เป็น 64 คำเท่านั้นเนื่องจากโค้ดนั้นสะอาดมากและการเข้าถึงทั้งหมดดำเนินการด้วยมาโครสองตัวด้านบน จึงจำเป็นต้องเปลี่ยนเพียง 16 บรรทัด (ทดสอบด้วยคีย์ 256 บิตเท่านั้น):

  1. ค้นหามาโครทั้งหมดที่เข้าถึงดัชนี 24 และเปลี่ยนเป็น 1
  2. ค้นหามาโครทั้งหมดที่เข้าถึงดัชนี 32 และเปลี่ยนเป็น 24

ฉันได้ทดสอบสิ่งนี้ในกระบวนการที่อธิบายไว้ข้างต้น

Maarten Bodewes avatar
in flag
เย็น. คุณได้ตรวจสอบว่าคุณสามารถแก้ไขรหัสเดิมได้หรือไม่? นั่นจะเป็นข้อพิสูจน์ขั้นสุดท้าย คุณสามารถยอมรับคำตอบของคุณเองได้หลังจากผ่านไป 2 วัน
DannyNiu avatar
vu flag
"รหัสอ้างอิง" ที่ *ด้านล่าง* ของ [หน้านี้](https://info.isl.ntt.co.jp/crypt/eng/camellia/source/) มีเวอร์ชันที่ฉันปรับให้เหมาะกับงานอดิเรกของฉัน โครงการ (`long` -> `uint32_t`) สำหรับสร้างเวกเตอร์ทดสอบ ดูเหมือนว่าจะทำงานได้อย่างถูกต้อง
devnull avatar
co flag
@DannyNiu ขอบคุณ ฉันได้อธิบายการแก้ไขและการทดสอบบางส่วนไว้ด้านบนแล้ว

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา