В предыдущем примере банк выдает банкноты только достоинством в 1 монету и все платежи должны быть кратны этой величине. Оказывается, можно реализовать и более гибкую систему. Рассмотрим следующую систему электронных платежей из работы Шаума [12]. Здесь уместно отметить, что все основные идеи, связанные с понятием неотслеживаемости, электронными деньгами и со схемами затемненной подписи, принадлежат этому голландскому математику.
Эта система также основана на схеме электронной подписи RSA. Допуская некоторую вольность в обозначениях, будем писать
k1/t mod n вместо kd mod n, где d·t = 1mod j(n),
и называть эту величину корнем t-й степени из k.
Как и выше, f: Z n —> Z n — некоторая односторонняя функция, которую выбирает и публикует банк.
Устанавливается соглашение, согласно которому корню степени, равной i -му нечетному простому числу, соответствует номинал в 2 i- 1 монет.
Пример: рассмотрим первые простые числа и соответствующие им номиналы монет:
Число | 3 | 5 | 7 | 11 | 13 | 17 | 19 |
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Номинал | 1 | 2 | 4 | 8 | 16 | 32 | 64 |
Итак, предъявитель пары
|
|
((k, k1/3 mod n)
является владельцем электронной банкноты достоинством в 1 монету. Если в этой паре вместо корня кубического присутствует корень 7-й степени, то банкнота имеет достоинство 4 монеты.
Если достоинство монеты не является степенью двойки, то нужна составная степень. Если нам нужна банкнота на 3 монеты, то 3=2+1 и корень должен иметь степень 3•5.
Если корень 3•7=21-й степени — то достоинство банкноты в 5=1+4 монет.
Иными словами, для банкноты достоинством S монетнеобходим корень степени, равной произведению всех простых чисел, соответствующих единицам в двоичном представлении числа S.
Все банкноты, выданные банком, имеют достоинство, равное 15 монетам. Тогда подпись банка на банкноте это — корень h -й степени, где
h= 3•5•7•11 так как 15=1+2+4+8=11112.
Для этой схемы нужен также еще дополнительный модуль RSA - n1, который используется в работе с так называемой копилкой. Этот модуль выбирается и публикуется таким же образом, как и модуль n.
Транзакция снятия со счета выполняется таким же образом, как описано выше. В результате покупатель получает электронную банкноту
((k1, f (k) 1/h mod n),.
Предположим теперь, что покупатель желает заплатить продавцу 5 монет. Для этого он вычисляет
f (k1)1/3×7mod n,
просто возводя полученную банкноту в 5×11=55-ю степень, и создает копилку, выбирая случайное значение j и вычисляя
f (j)• s1 5×11 mod n1.
Здесь опять s1 5×11 - затемняющий множитель.
Транзакция платежа начинается с пересылки значений
(k1 , f (k1)1/3×7mod n), (f (j)• s1 5×11 mod n1),
а также суммы платежа (5 монет) продавцу. Продавец в свою очередь передает всю эту информацию банку.
|
|
Банк легко проверяет, что пара
(k1, f (k1)1/3×7mod n)
представляет собой подлинную банкноту достоинством 5 монет. Он проверяет по специальному регистру, не была ли банкнота с номером k1 потрачена ранее. Если нет, записывает в регистр вновь полученную банкноту, увеличивает счет продавца на 5 монет и посылает продавцу уведомление о завершении транзакции платежа, а также «сдачу» (10 монет) покупателю, возвращаемую через копилку:
f (j)1/5•11• s1 mod n1.
В транзакции депозита покупатель посылает банку копилку
(j, f (j)5×11 mod n1).
Банк проверяет ее таким же образом, как и банкноту в транзакции платежа, и если копилка с номером j подлинная и ранее не использовалась в транзакции депозита, то зачисляет сумму 10 монет на счет покупателя.
Если все платежи, осуществляемые покупателями, делаются на максимальную сумму (15 монет), то схема обеспечивает безусловную (или теоретико-информационную) неотслеживаемость покупателя: выдавая затемненную подпись, банк не получает никакой информации о номере подписываемой банкноты.
Необходимость депозита полученной от банка «сдачи» нарушает неотслеживаемость: банк запоминает все платежи, а значит, и все «сдачи», и при выполнении транзакции депозита может «вычислить» клиента, если последний выполнил платеж на уникальную или достаточно редко встречающуюся сумму. Эта проблема частично может быть решена за счет многократного использования копилки в транзакциях платежа.
Предположим, что покупатель получил в банке вторую банкноту с номером k2 и желает заплатить тому же или другому продавцу сумму в 3 монеты. Тогда в транзакции платежа он может использовать копилку со «сдачей», оставшейся после первого платежа, и послать продавцу
k2 , f (k2) 1/3×5mod n, f (j)1 / 5×11 s1 7×11 mod n1.
Здесь 7×11 – степени, не используемые в монете номиналом 3 (3=2+1, i =3;5). Платеж выполняется таким же образом, как было описано выше, и в результате покупатель получит копилку
f (j)1 / 5×11×7×11 mod n1.
B транзакции депозита покупатель кладет накопленную в копилке сумму на свой счет в банке. Для этого он посылает банку значения
(j, f (j) 1/ 5×11×7×11 mod n1)
и указывает сумму. Банк проверяет копилку так же, как банкноту, т. е. Устанавливает наличие всех корней с объявленными покупателем кратностями, а также проверяет, не использовалась ли ранее копилка с номером j в транзакции депозита. При выполнении всех этих условий банк зачисляет сумму, находящуюся в копилке, на счет покупателя.
Если количество клиентов в платежной системе достаточно велико и если каждый из них использует в транзакциях платежа одну и ту же копилку до тех пор, пока накапливаемая в ней сумма не превысит определенный предел (скажем, 100 монет), а после этого сразу же выполняет депозит, то шансы банка отследить действия кого-либо из клиентов представляются практически ничтожными.