Як перевірити номер з Бобом, не знаючи Єви?


49

Вам потрібно перевірити, чи є у вашого друга Боб правильний номер телефону, але ви не можете запитати його безпосередньо. Ви повинні написати запитання на картці, яке подати Еві, хто візьме картку до Боба і поверне відповідь вам. Що потрібно написати на картці, крім питання, щоб переконатися, що Боб може кодувати повідомлення, щоб Єва не могла прочитати ваш номер телефону?

Примітка. Це запитання є у списку "запитань щодо інтерв'ю Google". Як результат, в Інтернеті є багато версій цього питання, і багато з них не мають чітких або навіть правильних відповідей.

Примітка 2: Смутна відповідь на це запитання полягає в тому, що Боб повинен написати «подзвони мені». Так, це дуже розумно, "поза коробкою" і все, але не використовує жодних прийомів у тому полі CS, де ми називаємо нашого героя "Боб" і його прибічного противника "Єва".

Оновлення:
бонусні бали за алгоритм, який ви та Боб могли обґрунтувати вручну.

Оновлення 2:
Зауважте, що Боб не повинен надсилати вам будь-яке довільне повідомлення, а лише підтверджуйте, що у нього є ваш правильний телефонний номер, а Єва не зможе його розшифрувати, що може чи не може призвести до більш простих рішень.


1
Але "телефонувати мені" зовсім не має сенсу, у нього ще немає вашого правильного номера телефону або, принаймні, ви не впевнені, чи є, тому я не думаю, що це дуже розумно.
Гігілі

1
@Gigili, якщо ви телефонуєте від нього, то він має ваш номер, якщо ви не отримуєте дзвінок, він не робить.
Джо,

1
О, так. Я все ще думаю, що це не розумно!
Джигілі

Ще одна відповідь, що відповідає мовою щоки, може бути шифром Цезаря . Навіть якщо Єва намагається здійснити всі можливі компенсації, у неї немає підстав вибирати будь-яку послідовність цифр над іншою (окрім спроб зателефонувати всім).
Рафаель

2
@Raphael Чи не існує лише 10 можливих шифрів цезаря над цифрами?
Джо,

Відповіді:


27

Спершу треба припустити, що Єва лише пасивна. Маючи на увазі, я маю на увазі, що вона правдиво надсилає листівку Бобу, і все, що вона повертає до Аліси, це справді відповідь Боба. Якщо Єва може змінити дані в будь-якому або в обох напрямках (а її дія залишається непоміченою), то все буде йти.

(Для вшанування давніх традицій дві чесні сторони, що беруть участь у розмові, називаються Аліса та Боб. У своєму тексті ви сказали "ви". Моє справжнє ім'я не "Аліса", але я відповім так, як ніби ви написали що Аліса хоче підтвердити номер телефону Боба.)

Проста (але слабка) відповідь - використовувати хеш-функцію. Аліса пише на картці: "поверніть мені SHA-256 хеш вашого номера телефону". SHA-256 - це криптографічна хеш-функція, яка вважається захищеною, наскільки це стосується хеш-функцій. Обчислити це вручну було б втомливо, але все-таки виконати (це приблизно 2500 32-бітних операцій, де кожна операція є доповненням, зсувом слова або поворотом або побітною комбінацією бітів; Боб повинен мати можливість це робити за день або тому).

Тепер що в цьому слабкого? SHA-256, будучи криптографічною хеш-функцією, стійкий до "попередніх зображень": це означає, що з урахуванням хеш-виводу дуже важко відновити відповідний вхід (це проблема, з якою стикається Єва). Однак "дуже важко" означає "найпростіший метод - груба сила: спроба можливих входів, поки не буде знайдено відповідність". Проблема полягає в тому, що груба сила тут проста: існує не так багато можливих номерів телефонів (у Північній Америці це 10 цифр, тобто лише 10 мільярдів). Боб хоче робити справи вручну, але ми не можемо вважати, що Єва настільки обмежена. Базовий ПК може спробувати кілька мільйонів хешів SHA-256 в секунду, тому Eve буде зроблено менше ніж за одну годину (менше 5 хвилин, якщо вона використовує GPU).

Це загальне питання: якщо Боб є детермінованим (тобто на певне повідомлення від Аліси, він завжди повертає ту саму відповідь), Єва може його імітувати. А саме, Єва знає все про Боба, окрім номера телефону, тому вона фактично працює 10 мільярдів Бобс, які відрізняються лише своїм передбачуваним номером телефону; і вона чекає, коли один з віртуальних Боб поверне все, що реально повернувся. Недолік впливає на безліч видів "розумних" рішень, що включають випадкові поняття, симетричне шифрування та інше. Це сильний недолік, і його корінь полягає у величезній різниці в обчислювальній потужності між Євою та Бобом (тепер, якщо в Боба також був комп'ютер, великий як у Єви, то він міг би використовувати повільнийхеш-функція за допомогою використання багатьох ітерацій; це більш-менш те, що стосується хешування паролів, з номером телефону замість пароля; див. bcrypt, а також цю відповідь ).

Отже, слабке рішення повинно включати деяку випадковість з боку Боба: Боб повинен перевертати монету або кидати кістки кілька разів та вводити значення у свої обчислення. Більше того, Єва не повинна бути в змозі розгадати те, що робив Боб, але Аліса повинна вміти, тому певна інформація конфіденційно передається від Боба до Аліси. Це називається асиметричним шифруванням або, принаймні, асиметричним ключовим договором. Найпростішим алгоритмом цього класу для обчислення, але все ще достатньо безпечним, є RSA з підкладкою PKCS №1 v1.5 . RSA може використовувати як публічний показник. Отже, протокол виходить таким чином:e=3

  • Аліса генерує велике ціле число де і мають аналогічний розмір просте ціле число, таким чином, щоб розмір був достатнім для забезпечення безпеки (тобто принаймні 1024 біт станом на 2012 рік). Також Аліса повинна домовитись, щоб і не були кратними 3.p q n p - 1 q - 1n=pqpqnp1q1

  • Аліса пише на картці.n

  • Спочатку Боб додає свій номер телефону до послідовності байтів до , як це описано в PKCS # 1 (це означає: 00 02 xx xx ... xx 00 bb bb .. bb, де 'bb' - це десять байтів, які кодують номер телефону та 'xx' - випадкові ненульові значення байтів на загальну довжину 128 байт, якщо 1024-бітне ціле число).nnn

  • Боб трактує свою послідовність байтів як велике ціле значення (велике ендіанське кодування) і обчислює (так що це пара множень з дуже великими цілими числами, потім поділ, в результаті чого залишок поділу). Це все ще можливо зробити вручну (але, знову ж таки, це, можливо, займе більшу частину дня). Результат - це те, що Боб повертається до Аліси.м 3 м о д нmm3 mod n

  • Аліса використовує свої знання з і щоб відновити з надісланого Боб. Сторінка Вікіпедії на RSA має досить чіткі пояснення цього процесу. Після того, як Аліса має , вона може видалити прокладку ("xx" не дорівнює нулю, тому перший байт "bb" може бути однозначно розташований), а потім у неї є номер телефону, який вона може порівняти з тим, що мала.q m m 3 m o d n mpqmm3 mod nm

Для обчислення Аліси знадобиться комп'ютер (те, що робиться на комп’ютері, завжди елементарно і вручну, але комп'ютер на ньому диявольсько швидкий, тому "виконуваному" може знадобитися занадто багато часу на практиці; розшифровка RSA вручну зайняла б багато тижні).

(Насправді ми могли б зробити швидше ручне обчислення за допомогою шифрування McEliece , але тоді відкритий ключ - те, що Аліса пише на картці - був би величезним, а картка просто не зробила б; Єві доведеться перевезти повну книгу цифр.)


1
Просто швидкий коментар, ще одна слабкість у першому протоколі (Аліса каже, "надішліть мені хеш номер телефону") полягає в тому, що він вразливий до атаки повторного відтворення. Якщо ви реалізовували це в реальному світі, Аліса повинна надіслати випадкову рядок (який називається "nonce"), що хеширується разом з номером телефону.
Псевдонім

1
Ви сказали, що "все йде", якщо Єва може змінити повідомлення, але це не обов'язково є втраченою причиною. Використовуючи RSA, ми також можемо захистити повідомлення від MITM-атак. Надішліть запитання: "У вас мій номер телефону?", Плюс ваш відкритий ключ, плюс підпис (повідомлення + ваш номер телефону), підписаний вашим приватним ключем. Якщо Єва спробує змінити повідомлення (змінити відкритий ключ на свій власний), вона не зможе створити дійсний підпис, оскільки не знає ваш номер телефону.
stevendesu

15

Схоже на класичне застосування криптосистеми відкритого ключа, як RSA .

Ви надсилаєте свій відкритий ключ разом, ББ шифрує ваш номер телефону зі свого списку контактів і повертає його вам назад.


5
Враховуючи Боба і Єву, це, мабуть, має бути ключовою ідеєю. Чи це практично в цьому контексті (олівець та папір)? Крім того, я сподівався на трохи більше, ніж посилання на статтю у Вікіпедії зі прапором "ця стаття потребує редагування".
Джо

@Joe: я змінив, щоб включити ще одне посилання. Я впевнений, що ви чули про RSA. RSA, ймовірно, достатньо практичний, оскільки написання припустимо, що 1000 цифр не повинно зайняти багато часу.
Ар'ябхата

14

Однією з найосновніших речей, яку ви можете зробити, є обмін ключами Diffie-Hellman . Це не вимагає, щоб у вас були налаштовані ключі до початку спілкування, коли він узгоджує один із способами, щоб слухачі не могли самі отримати ключ. Детальну інформацію див. У вичерпній статті Вікіпедії .

pgpggamodpa

  • gbmodpb
  • gabmodp

gamodpgbmodpgabmodp

Якщо належним чином реалізовано і обидва комунікатори та зловмисник мають приблизно однакову потужність обчислення у своєму розпорядженні, це безпечно.


2

Боб не повинен надсилати повідомлення, які можна розшифрувати. Він повинен лише довести вам, що у вас є ваш номер телефону. Тому Cryptographic Hash Functions (одностороннє шифрування) пропонує альтернативу криптосистемі з відкритим ключем. В даний час SHA-2 є популярним прикладом такої функції.

У цій стратегії вам ніколи не доведеться розшифровувати повідомлення Боба до вас. Ви кажете Бобу, яку функцію хешу ви хотіли б використовувати, наприклад, "Боб, будь ласка, використовуй SHA-2, щоб зашифрувати мій номер телефону і щоб Єва передавала мені результат". Потім ви використовуєте той самий алгоритм для хешування вашого номера телефону і перевіряєте, чи отримаєте ви той самий хеш, який отримав Боб. Вкрай малоймовірно, що два різні телефонні номери матимуть один і той же хеш, і тому ви можете визначити, чи є у Вашого правильний номер телефону Боб.

Якщо у вас, Боба та Єви, немає доступних комп'ютерів для обчислення хеш-функції (або здійснення грубої атаки), можливо, можливо використовувати хеш-функцію, яка приносить певну безпеку від нападів грубої сили, але набагато простіше для вас і Боба обчислити.


Я писав ту саму відповідь! Нещасливий Я все одно опублікую його, як на це витратив час.
Гігілі

@Gigili Я сподівався, що хтось напише цю відповідь, але я вирішив, коли побачив, що ніхто ще не пропонує цю альтернативу ... Я все ще шукаю зручну для олівця версію. Чесно кажучи, я не хотів би просити свого друга зробити RSA або SHA-2 вручну.
Джо,

Проблема полягає в тому, що кожен простий алгоритм, який можна зробити вручну, був би зашифрований Євою.
Джигілі

@Gigili ти маєш на увазі "розшифрований Євою"? Проблема дуже обмежена. Схоже, має бути простіший односторонній хеш із 7-значних цілих чисел, який Єва не може просто скасувати, щоб повернути початкове число.
Джо,

На жаль, я мав на увазі, очевидно, розшифрований.
Гігілі

0

Простим рішенням буде:

І Аліса, і Боб домовляються про один і той же колір. і це не проблема, якщо Єва знає це, ми назвемо цей П. Скажімо, він жовтий. Тепер Аліса і Боб випадковим чином вибирають приватний колір, скажімо, "х". Аліса вибирає червоний, а Боб обирає синій. Тепер вони змішують їх разом з P. Alice тепер має помаранчевий, а у Bob - зелений. Аліса передає помаранчевий колір Боб, а Боб посилає свій зелений колір Алісі Єві, тепер знає про жовтий, помаранчевий і зелений, але Аліса також знає її приватний колір червоний, а Боб знає свій приватний колір синій, про який ніхто більше не знає. І Аліса, і Боб беруть свої оригінальні приватні кольори і додають їх до тих, що вони тільки що обмінялися. Тепер, якщо вони змішують свої оригінальні приватні кольори, червоний і синій, у загальний колір, вони обидва закінчуються одним кольором, коричневим або цегляно-червоним.

Замість того, щоб змішувати кольори разом, ви можете використовувати так, що p - велике просте число, а g - примітивний корінь p, оскільки якщо ви для будь-якого x, результат (число між нулем і p - 1) однаково вірогідний для будь-якого з цих, тому існує первісний корінь. якщо p - просте число 2n + 1, таке, що n також є простим, то ви знаєте, що 2 - це примітивний корінь p (а це означає, що вам не доведеться турбуватися обчисленням примітивного кореня, який є таким же важким), таким чином загальний секрет = для Боба, а для Аліси.gx(modp)А хgx(modp)Б уAx(modp)By(modp)


Я думаю, ви можете написати щось подібне на картці:

Число кратне 3,5 і 7 (наприклад).

Існує ( - кількість цифр) можливостей, і ця ідея просто скасує кілька можливостей для того, хто має про це уявлення. Тож розшифровка Євою не відбудеться. n(10)nn


Це розповідь про зображення, знайдене у статті Вікіпедії про обмін ключами Diffie-Hellmann . Ви повинні хоча б згадати своє джерело.
Рафаель

@Raphael: Я сам цього не знав, хтось мені це пояснив, і я подумав, що це гарна ідея.
Джигілі

0

Просто попросіть Боба помножити число на 2 або 3 або що-небудь інше і згорнути це число з самим числом. Це можна виконати вручну та повернути, якщо число відоме. Ні ша, rsa, ні md5. Просто звичайна математика.


3
Ця відповідь неправильна. Простий, виконаний вручну і абсолютно незахищений. Це просто не працює. Єва може відновити багато інформації про номер телефону з цього.
DW

0

Надішліть Бобу кодове слово, зашифроване з вашим номером телефону; якщо він поверне вам кодове слово назад, ви знаєте, що він має правильний номер.

Слабка слабкість полягає в тому, що Єва може імітувати Боба, тому просто спробуйте кожен номер телефону, поки вона не отримає той, який видає якесь кодове слово, як повернувся Боб.

Тож змусьте Боба додати до кодового слова дуже велике випадкове число, а потім зашифрувати його, перш ніж надсилати вам його назад. Це робить простір пошуку Eves таким же великим, як ви хочете.


Це не здається правильним. Якщо у Боба неправильний номер, він спочатку розшифрує та отримає неправильне кодове слово. Після цього він додає до кодового слова випадкове число і шифрується неправильним ключем. Коли повідомлення отримується та розшифровується правильним ключем, перший сегмент відновленого повідомлення, можливо, може бути правильним кодовим словом, навіть незважаючи на те, що число Боб має неправильне значення.
Поінформовано

@randomA Вам просто потрібно зробити кодове слово досить довгим, щоб ймовірність того, що трапиться, настільки мала, що вам це не важливо.
Ян Рінгроуз

Те, що ви сказали, є правдою, але обране рішення також дуже приємне в цьому питанні. Я б не погоджувався лише з обраним рішенням з боку "тому деякі відомості конфіденційно передаються від Боба до Аліси". Якщо ви користуєтеся повідомленням про вкладку, яке є досить великим і не містить символу, який використовується для представлення номера телефону, то Боб може випадковим чином ввести номер телефону в нього, і Аліса може легко відновити номер телефону з розшифрованого повідомлення, не знаючи випадкових кроків, які зробив Боб ( конфіденційно передана інформація в цьому випадку не потрібна).
ПоінформованоA

-1

Я напишу на картці десь 10 номерів телефонів, і серед тих, хто переконається, що Мій номер буде поруч із номером Боба, і згадаю "Ей, Бобе, мій номер поруч із твоїм номером, будь ласка, підтверди" :)


1
припускаючи, що я знаю номер боба, а напередодні це не так: P
everlasto

-1

Я думаю, що питання набагато простіше, ніж всі думають. Нам потрібно переконатися, що число, у якого є Боб, є правильним (або, як це може бути, неправильним). Оскільки ми "перевіряємо", чи правильне число, можна припустити, що у Боб уже є ваш номер. Тому немає необхідності надсилати Боб свій номер у якийсь код. Моя відповідь буде: "Шановний Боб, будь ласка, телефонуй на мій номер. Дякую, Аліса"


1
Питання вже явно виключає цю тривіальну відповідь.
Девід Річербі

-2

спробуйте виконати трійку, як це

рішення1: якщо число 37, хеш-карта виглядала б так

01 07

15 12

25 20

31 36

49 43

53 50

60 62

72 72

85 82

91 94

і зробіть те ж саме для 10 цифр або навіть більше, щоб плутати: P

рішення2: або побудуйте многочлен, у якому ваше число стає деяким іншим унікальним числом

рішення3: напишіть це в листі "чувак дзвони мені"

рішення4: записати функцію таким чином, щоб вона робила операції над кожною цифрою і повертала 0, то він надсилає істинне або помилкове рішення5: якщо обидва кінці поділяють загальну хеш-функцію ... це робить життя дуже легким


Зовсім не очевидно, як ваша схема кодує 37.
Девід Річербі,

все, що нам потрібно зробити - це карта ... 31 жирним шрифтом 3 знаходиться в положенні 1 .... 72 означає 7 знаходиться в положенні 2 ... вибачте, якщо це було не дуже інтуїтивно зрозуміти
Аджай Редді,

Це слід детально пояснити у відповіді. Але серйозно, якщо це ваша схема кодування, вона не зовсім безпечна, чи не так?
Девід Річербі,

-2

Я думаю, що ми можемо це зробити, використовуючи основні розрядні операції або можемо налаштувати його для роботи з папером та олівцем. Якщо число Аліси є наприклад: 663, то вона може просто перетворити число за цією методологією. Перетворіть кожну цифру в еквівалентне двійкове представлення, скажіть це як A 663-> 110 110 011, ніж зворотні відповідні біти для кожного окремого числа, скажіть це як B-> 011 011 110 Тепер зробіть A і B-> 010 010 010 Тепер відправте це число на bob і попросіть зробити те ж саме, якщо результат приходить однаковий, попросіть його сказати так чи інакше Ні. У цьому випадку напередодні не вдасться розшифрувати число, і існує дуже низька ймовірність, що різні цифри закінчуються цим самим поданням. Єдиний спосіб, коли Єва може здогадатися, - це записати всі можливі комбінації, а потім спробувати їх усі, крім того, щоб задовольнити, що ми можемо ускладнити це ще більше, використовуючи зсув вліво або вправо і додаючи фіктивні шматочки.


Це не працює. По-перше, середній біт кожної 3-бітної групи залишається недоторканим. По-друге, перший і третій біт кожної групи переданого повідомлення завжди буде однаковим і зазвичай нульовим, що призведе до безлічі помилкових позитивних результатів. По-третє, і смертельно, три біти можуть представляти лише вісім значень, але десяткова цифра може приймати будь-яке з десяти значень. По-четверте, ваше останнє речення по суті, "О, і якщо це не спрацює, спробуйте щось складніше". Як от?
Девід Річербі

-3

Будь ласка, зателефонуйте мені (мене звуть 1001001). Якщо ви не можете зв'язатися зі мною, напишіть номер телефону та попросіть Єву повернути мене.

Пояснення: якщо Боб отримав мій правильний номер #, він може зв’язатися зі мною, то я знаю, що це правильно #; якщо Боб не отримав мого права #, Єва також не може прочитати мій (правильний) номер телефону. Таким чином я вже перевірив, чи мій друг Боб має мій правильний номер телефону чи ні.


to everlasto: Єва може зв’язатися з Боб, так що, швидше за все, у неї є його #. Тому, якщо ви запитаєте "Ей, Бобе, мій номер поруч із вашим номером, будь ласка, підтвердьте це", Єва дізнається вас #.
Pobol Wong

1
У запитанні прямо сказано, що ви не можете просто надіслати Бобу листівку з написом "зателефонуйте мені". І Боб, записавши неправильний номер на картці, якщо він не зміг пройти, нічого не додає.
Девід Річербі

Я раніше писав програму кодування / декодування LZW. Я можу попросити Боба використати його, щоб надіслати мені закодований номер # мого телефону, а також я можу використовувати його для кодування правильної частини мого телефону # до нього.
Pobol Wong

до Девіда Річербі: в цьому питанні згадується лише "ти не можеш його прямо запитати", це означає, що я, 1001001, не можу прямо запитати Боба, але повинен мати можливість попросити його зателефонувати мені по телефону #, який він отримав.
Pobol Wong

Прочитайте питання уважніше. "Примітка 2" у запитанні відхиляє рішення надсилання записки з проханням Боба зателефонувати вам, оскільки вона не використовує жодної інформатики.
Девід Річербі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.