สร้าง PIN ที่ปลอดภัยบางส่วน


17

แรงบันดาลใจจากการโพสต์นี้ได้รับการโอนย้ายไม่ดี

หัวหน้าฝ่ายรักษาความปลอดภัยที่ บริษัท ของคุณเป็นห่วงเกี่ยวกับระบบการสร้าง PIN ของคุณหลังจากที่ให้ระบบ12345แล้ว นอกจากนี้เขายังไม่ได้ชื่นชม Spaceballs ที่คุณสร้างขึ้นด้วยค่าใช้จ่ายจริง ๆ ดังนั้นคุณจึงได้รับมอบอำนาจให้เขียนรหัส PIN ใหม่ เนื่องจากต้องพอดีกับฮาร์ดแวร์พิเศษบางอย่างคุณจึงต้องทำให้มีขนาดเล็กที่สุดเท่าที่จะทำได้

งานของคุณ

  • คุณรับการป้อนข้อมูลสองรายการ - # ของ PIN และขนาด PIN เป็นตัวเลข
  • สร้างหมายเลข PIN ที่ระบุของขนาดที่ระบุแบบสุ่มและพิมพ์ออกมา
  • ขนาดของ PIN ที่ถูกต้องทั้งหมดจะต้องเป็นไปได้ที่จะพิมพ์ออกมาแม้ว่าจะไม่น่าจะเป็นไปได้ที่สม่ำเสมอ
  • อย่างไรก็ตามมีข้อ จำกัด บางประการเกี่ยวกับ PIN - ต่อไปนี้เป็นข้อผิดพลาด:

    1. หากคู่ทั้งหมดเป็นตัวเลขเดียวกัน: 114422(หมายเหตุ: นี่จะรวมถึง PIN หลักที่เหมือนกันทั้งหมด)
    2. PIN เชิงเส้นเพิ่มมากขึ้น (mod 10): 24680210):
    3. กลุ่มทั้งหมด 3 เส้นเป็นฟิสิคัลบนปุ่มกดของ1 2 3;4 5 6;7 8 9;bksp 0 enter;:147369 :
    4. PIN สามารถแบ่งออกเป็นกลุ่ม ๆ ได้จากกฎ 1 และกฎ 3


  • นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

กฎหนึ่งรวมคู่คู่เดียว (เช่น55123) ด้วยหรือไม่
mınxomaτ

@minxomat จุดที่ดีทำลายกฎเพื่อรวมทั้งสองกลุ่ม คนนั้นจะนับตั้งแต่ครึ่งหลัง123แต่55432ก็ไม่เป็นไร
Maltysen

กฎ 3 รวม diagonals หรือไม่
Martin Ender

6
ประชดคือความหมายของพินที่เรียกว่า "ปลอดภัย" นี้จะลดจำนวนผู้โจมตีพินเท่านั้นที่อาจต้องดุร้าย!
DankMemes

1
ความยาวสั้นที่สุดสำหรับกฎ 2 คืออะไร
เดนนิส

คำตอบ:


1

Pyth, 120 ไบต์

Arz7VGJ1WJK%"%0*d",HO-^TH1=J|q1l{m%-F_vMcd1T.:K2u|GHmu|GHm?qlk2:k"(.)\\1"0?qlk3}k+++=bcS"123456789"3_Mb.Tb_M.TbZdZ./K0)K

คิดว่าฉันควรเพิ่มการใช้งานจริงแล้ว สร้างตัวเลขสุ่มจนกว่าจะพบหนึ่งที่ตรงกับความต้องการทั้งหมด สามารถปรับปรุงได้มาก!

เวอร์ชั่นออนไลน์


1
ฉันได้เปลี่ยนกฎเพื่อรวมข้อกำหนดที่ PIN ต้องสุ่มและต้องเป็นไปได้ทั้งหมด
Maltysen

ฉันคิดว่าคุณอาจจะ :)

0

Perl 5, 244

เริ่มต้นด้วยการสร้างตัวเลขสุ่มสำหรับขนาดที่กำหนด
และพิมพ์เฉพาะสิ่งที่ไม่ตรงตามข้อ จำกัด เท่านั้น

การหาวิธีแก้ปัญหาสำหรับสายปุ่มกด (โดยไม่ต้องใช้การรวมรหัส) เป็นเรื่องสนุก

($k,$l)=@ARGV;$m=10**$l-1;while($n<$k){$_=sprintf("%0".$l."d",int(rand($m)));@N=split//,$_;pop@N;$i=$d=0;while(++$i<@N&&$d<1){$d=$N[$i-1]<=>$N[$i]}$b=$_;$b=~s|\d|@A=split//,$';2*$A[0]-$&-$A[1]==0|eg;if((!m/(\d)\1/)&$b>0&$d>=0){$n++;print$_.$/}}

ทดสอบ

$ perl gen_pins.pl 10 5
98121
15931
69042
93730
83458
25312
24601
49468
49490
67012
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.