<< Предыдущая

стр. 77
(из 82 стр.)

ОГЛАВЛЕНИЕ

Следующая >>


Б . 5 . 3 . Public_Commitment.java
Третий класс содержит только открытые величины обязательства.

import Java.math.Biglnteger;
class Public-Commitment
{
private Biglnteger b;
private Parameters PK;
public Public-Commitment (Parameters P)
{ PK=P; }
public void assign(BigInteger bl) { b=bl; }
public Parameters get_Params() { return PK; }
public Biglnteger getBO { return b; }
}

Б . 5 . 4 . C o m m i t merit JFactory. Java
Этот четвертый класс создает открытую-секретную пару обяза­
тельства. Идея состоит в том, что пользователь использует этот
класс для создания пары, открытую часть которой он публикует, а
секретную хранит в тайне до определенного момента.

import Java.math.Biglnteger;
import Java.security.*;
class CommitmentJFactory
{
private Parameters PK;
private Public .Commitment Pub;
private Private-Commitment Priv;
public Commitment-Factory (Parameters P)
{ PK=P; }
public void Commit (int cc .SecureRcindom random)
throws ArithmeticException
{
Biglnteger q=PK.getQ()
Biglnteger p=PK.getP()
Biglnteger g=PK.getG()
Biglnteger h=PK.getH()
if (cc!=l && cc!=-l)
{ throw new ArithmeticException
502 Прилоэюение Б. Примеры на языке Java

("Commitment should be +/- 1");
}
Biglnteger a,b,c,tl,t2;
a=new Biglnteger(q.bitLengthO ,random);
a=a.mod(q);
c=BigInteger.ONE;
if (cc<0) { c=c.negate(); }
tl=g.modPow(a,p);
t2=h.modPow(c,p);
b=tl.multiply(t2);
b=b.mod(p);
Pub=new Public-Commitment (PK);
Pub.assign(b);
Priv=new Private-Commitment (PK) ;
Priv.assign(a,b,c);
}
public Public-Commitment getPublicO { return Pub; }
public Private-Commitment getPrivateO { return Priv; }
}

Б.5.5. Proof.Java
Теперь мы можем представить класс, который генерирует доказа­
тельство с секретной частью обязательства на входе и проверяет
доказательство, если на вход подается открытая часть обязатель­
ства. Здесь используется хэш-функция SHA-1^ встроенная в стан­
дартный пакет Java.

import Java.math.Biglnteger;
import Java.security.*;
class Proof
{
private Biglnteger dl,d2,rl,r2,alphal,alpha2;
public Proof 0 { ; }
public void Assign-Proof( Biglnteger Dl,Biglnteger D2,
Biglnteger Rl,Biglnteger R2,
Biglnteger Al,Biglnteger A2)
{ dl=Dl; d2=D2;
rl=Rl; r2=R2;
alphal=Al; alpha2=A2;
}
Б.5. Доказательства с нулевым разглашением и обязательства

return dl; }
public Biglnteger get_dl()
public Biglnteger get_d2() return d2; }
public Biglnteger get_rl() return rl; }
public Biglnteger get_r2() return r2; }
public Biglnteger get_alphal() return alpal; }
public Biglnteger get_alpha2() return alpa2; }

public void Make_Proof (Private-Commitment priv,
SecureRandom random
throws NoSuchAlgorithmException
{
Parameters P=priv.get-Params();
Biglnteger p=P.getP()
Biglnteger q=P.getQ()
Biglnteger g=P.getC()
Biglnteger h=P.getH()
// Form the Commitment
Biglnteger r,d,w;
r=new BiglntegerCq.bitLengthO,random); r=r.modCq);
d=new BiglntegerCq.bitLengthO,random); d=d.modCq);
w=new BiglntegerCq.bitLengthO,random); w=w.modCq);
Biglnteger tl,t2,t3;
tl=g.modPowCr,p);
t2=g.modPowCw,p);
Biglnteger a,b,c;
a=priv.getAC);
b=priv.getBC);
c=priv.getCC);
if Cc.equalsCBiglnteger.ONE))
{ t3=b.multiplyCh);
t3=t3.modCp);
}
else
{ t3=h.modInverseCp);
t3=t3.multiplyCb);
t3=t3.modCp);
}
t3=t3.modPowCd,p);
t3=t3.modInverseCp);
tl=tl.multiplyCt3); tl=tl.modCp);
if Cc.equals CBiglnteger.ONE))
{ alphal=tl; alpha2=t2; }
Прилоэюение Б. Примеры на языке Java

else
{ alphal=t2; alpha2=tl; }
// Form the challenge
MessageDigest MD=MessageDigest.getInstance("SHA");
MD.update(b.toByteArray());
MD.update(alphal.toByteArray());
MD.update(alpha2.toByteArray());
byte[] hash=MD.digest();
Biglnteger challenge=new Biglnteger(hash);
challenge=challenge.mod(q);
// Form the response
if (c.equals(Biglnteger.ONE))
{ dl=d;
d2=challenge.subtract(dl);
rl=r;
r2=a.multiply(d2);
r2=r2.add(w);
}
else
{ d2=d;
dl=challenge.subtract(d2);
r2=r;
rl=a.multiply(dl);
rl=rl.add(w);
}
dl=dl.mod(q); d2=d2.mod(q);
rl=rl.mod(q); r2=r2.mod(q);
}
public boolean Check_Proof (PubliC-Commitment pub)
throws NoSuchAlgorithmException
{
Parameters P=pub.get_Params();
Biglnteger p=P.getP();
Biglnteger q=P.getQ();
Biglnteger g=P.getC();
Biglnteger h=P.getH();
Biglnteger b=pub.getB();
Biglnteger el,e2;

// Form the challenge
MessageDigest MD=MessageDigest.getInstance("SHA");
MD.update(b.toByteArray());
Б.5. Доказательства с нулевым разглашением и обязательства 505

MD.update(alphal.toByteArray());
MD.update(alpha2.toByteArray());
byte[] hash=MD.digest();
Biglnteger challenge=new Biglnteger(hash);
challenge=challenge.mod(q);
el=dl.add(d2); el=el.mod(q);
if (!el.equals(challenge)) { return false; }
el=g.modPow(rl,p);
e2=e2.mod(p); e2=b.multiply(h);
e2=e2.modPow(dl,p);
e2=e2.multiply(alphal); e2=e2.mod(p);
if (!el.equals(e2)) { return false; }
el=g.modPow(r2,p);
e2=h.modInverse(p);
e2=b.multiply(e2); e2=e2.mod(p);
e2=e2.modPow(d2,p);
e2=e2.multiply(alpha2); e2=e2.mod(p);
if (!el.equals(e2)) { return false; }
return true;
}
}


Б.5.6. prog.java
В заключение приведем тестовую программу, собирающую все пре­
дыдущие вместе.

import Java,security.*;
import Java.math.Biglnteger;
public class prog
{
public static void check (int cc, Commitment-Factory CF,
SecureRandom random)
throws NoSuchAlgorithmException
{
System.out.printIn("\n\nChecking with cc = "+cc+"\n");
// Make the commitment
CF.Commit(cc,random);
Public-Commitment pub=CF.getPublic() ;
Private-Commitment priv=CF.getPrivate() ;
506 Прилооюение Б. Примеры на языке Java

{ Biglnteger a,b,c;
b=pub.getB();
a=priv.getA(); c-priv.getС();
System.out.printIn("Private Commitment");
System.out.printIn(" a = " + a +"\n с = " + c);
System.out.printIn("\nPublic Commitment");
SyStem.out.printIn(" b = " + b ) ;
}
/* Делаем доказательство */
Proof Sender=new Proof ();
Sender. Make-Proof (priv, random) ;
Biglnteger dl,d2,r1,r2,alphal,alpha2;
dl=Sender.get_dl() ; d2=Sender.get_d2() ;
rl=Sender.getjrl(); r2=Sender.getjr2();
alphal=Sender. get alphal () ; alpha2=Sender. get^lpha2 ();
System.out.printIn("\nProof");
System.out.printIn(" dl = "+dl)
SyStem.out.printIn(" d2 = "+d2)
System.out.printIn(" rl = "+rl)
System.out.printIn(" r2 = "+r2)
System.out.printIn(" alphal = "+alphal);
System.out.printIn(" alpha2 = "+alpha2);
/• Проверка доказательства */
System.out.printIn("\nChecking Proof");
Proof Reciever=new Proof();
Reciever. AssignJProof (dl, d2, r 1, r2, alphal, alpha2) ;
System.out .pintln(Reciever.Check-Proof (pub)) ;
}
public static void main(String[] args)
throws NoSuchAlgorithmException,
NoSuchProviderException
{
SecureRandom random=new SecureRandomO;
Parameters domain=new Parameters(random);
Commitment-Factory CF = new Commitment-Factory (domain);
check(1,CF,random);
che ck(-1,CF,random);
}
}
Дополнение I
Зашифрованные поисковые системы
Владимир Насыпный, Галина Насыпная
Одно из направлений совершенствования современных информа­
ционных поисковых систем — это повышение их интеллектуали­
зации с сохранением высокого уровня безопасности. Использова­
ние стохастической информационной технологии позволяет ком­
плексно повысить «инппеллект» поисковой системы без ослабле­
ния ее защищенности. В данной работе впервые показывается
возмооюность проведения семантического анализа, определяемо­
го требованиями к поисковой системе, зашифрованных тексто­
вых документов с использованием стохастически защищенных баз
знаний и программных средств.


Д . I.I. Введение

<< Предыдущая

стр. 77
(из 82 стр.)

ОГЛАВЛЕНИЕ

Следующая >>