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

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

ОГЛАВЛЕНИЕ

Следующая >>

SHA-1 и MD5

import Java, security.*;
import java.io.*;

public class HashJDemo
{
static void DigestJ)emo(String Alg)
throws NoSuchAlgorithmException,
UnsupportedEncodingException
{
byte[] data;
int i;
data=new byte [100];
System.out.printIn("\nDemo of "+Alg);
MessageDigest MD=MessageDigest.getInstance(Alg);
Б.4- Цифровые подписи 495

for (i=0; i<100; i++) { data[i]=(byte) i; }
MD.update(data);
byte[] hash=MD.digest();
System, out .print In (To Лех (hash)) ;
for (i=0; i<100; i++) { data[i]=(byte) (i+10); }
MD.update(data);
hash=MD.dige st();
System. out. print In (ТоЛех (hash) ) ;

System.out.flush0;
}

public static void main(String[] args)
throws NoSuchAlgorithmException,
UnsupportedEncodingException
{
DigestJ)emo("SHA");
DigestJ)emo("MD5") ;
}
}


Б.4. Цифровые подписи

Следующая программа показывает, как можно подписать данные
с помощью стандартной библиотеки Java. Она поддерживает как
DSA^ так и RSA^ хотя последний основывается на наивном алго­
ритме хэш-функции. Чтобы реализовать RSA-алгоритм подписи со
свойством доказуемой стойкости, такой, например, как RSA-PSS^
необходимо инсталлировать Cryptix J СЕ.
В версию DSA встроены такие параметры домена, как р^ q и G.
Однако мы показываем, как можно самостоятельно использовать
класс Biglnteger в Java.

import Java.security.*;
import Java.security.spec.*;
import java.security.interfaces.*;
import Java.math.Biglnteger;
import java.io.*;
Прилооюение Б. Примеры па языке Java
496

import cryptix.j се.provider.CryptixCrypto;

public class SignatureJDemo
{
static void Do_Signature(Signature Alg,
PrivateKey priv.PublicKey pub)
throws InvalidKeyException,
SignatureException,
UnsupportedEncodingException
{
/* Получаем сообщение */
byteC] message=new byte [100];
for (int i=0; i<100; i++) { message[i]=(byte) i; }
/* Теперь делаем некоторое подписывание */
Alg,initSign(priv);
Alg.update(message);
byte[] signature=Alg.sign();
System.out .printlnC'Signature = " + To_Hex(signature));

/* Делаем проверку */
Alg.initVerify(pub);
Alg.update(message);
boolean verifies = Alg.verify(signature);
System.out.printlnC'Signature Verifies : " + verifies);
System.out.flush0;
}
static void RSA_Sig (String Alg)
throws NoSuchAlgorithmException,
NoSuchProviderException,
InvalidKeyException,
SignatureException,
UnsupportedEncodi ngException
{
System.out.println("\n\n"+Alg+" Demo");
SecureRandom random= new SecureRandomO;
KeyPairGenerator KGen=KeyPairGenerat or. get Instance ("RSA");

KeyPair pair = KGen.generateKeyPairO ;
PrivateKey priv=pair.getPrivate();
PublicKey pub=pair,getPublic();
System.out.printIn("Private key is " +
Б.4- Цифровые подписи 497

((RSAPrivateKey) priv) .getPrivateExponent() .toStringO) ;

System.out.printIn("Public key is " +
((RSAPublicKey) pub) .getPublicExponent() .toStringO) ;

System.out.printIn("Modulus is " +
((RSAPublicKey) pub) .getModulusO .toStringO) ;
/* Делаем подпись*/
Signature rsa=Signature.get!nstance(Alg);

Do_Signature(rsa,priv,pub);
}
/* flag=l влечет использование встроенных параметров домена
=0 влечет самостоятельное генерирование параметров */
static void DSA(int flag)
throws NoSuchAlgorithmException,
NoSuchProviderException,
InvalidAlgorithmParameterException,
InvalidKeyException,
SignatureException,
UnsupportedEncodingExcepfion
{
System.out.println("\n\nDSA Demo");

SecureRandom random= new SecureRandomO ;

/* Генерируем параметры домена */
KeyPairGenerator KGen=KeyPairGenerator. get Instance ("DSA") ;
if (flag==0)
{ /* Генерируем собственные параметры домена */
Biginteger p,q,g,t,one=BigInteger.ONE;
/* Находим q */
q=new Biglnteger(160,20,random);
/* Ищем p */
do
{ t=new Biginteger(1024-160,random);
p=q.multiply(t); p=p.add(one);
}
while ( !p.isProbablePrime(20)
II (p.bitLengthO 1=1024) ) ;
/* Подбираем G */
do
498 Прилоэюение Б. Примеры на языке Java

{ G=new Biginteger(1024,random);
G=G.modPow(t,p);
}
while ( G.equals(one));

DSAParameterSpec dsaSpec
= new DSAParameterSpec(p,q,G);
KGen.initialize(dsaSpec,random);
}
else
{ KGen.initialize(1024,random); }
/* Генерируем ключевую пару */
KeyPair pair = KGen.generateKeyPairO ;
PrivateKey priv=pair.getPrivate();
PublicKey pub=pair.getPublic();
DSAParams Params=((DSAPublicKey) pub).getParamsO;
System.out .pnintIn(" p = " + Params.getPO .toStringO);
System.out .printIn(" q = " + Params.getQO) .toStringO);
System.out .printIn(" G = " + Params.getGO .toStringO) ;
System.out.printIn("Private key is "
+ ((DSAPrivateKey) priv) .getXO .toStringO);
System.out.println("Public key is "
+ ((DSAPublicKey) pub) .getY() .toStringO) ;
/* Делаем подпись */
Signature dsa=Signature.getInstance("SHAlwithDSA");

Do_Signature(dsa,priv,pub);
}
public static void main(String[] args)
throws NoSuchAlgorithmException,
NoSuchProviderException,
InvalidAlgorithmParameterException,
InvalidKeyException,
SignatureException,
UnsupportedEncodingException,
InvalidKeyException
{
Provider c_jce = new CryptixCryptoO ;
int result = Security.addProvider(c_jce) ;
if (result==-l)
{ System.out.printIn("Provider already exists.\n"); }
Б.5. Доказательства с нулевым разглашением и обязательства 499

else
{ System.out.printlnC'Provider added.\п"); }
RSA_Sig("SHAlwithRSA"); // Uses only standard API
RSA_Sig("RSASSA-PSS/SHA-l"); // Needs Cryptix
DSA(l); // Uses only standard API
DSA(O); // Uses only standard API
}
}


Б.5. Доказательства с нулевым разглашением и
обязательства
Закончим приложение примерами, которые непосредственно не ис­
пользуют криптографическую библиотеку API в языке Java. Здесь
мы реализуем протоколы обязательств из главы 13, которые при­
менялись в протоколе голосования. Кроме того, мы приведем про­
грамму доказательства того, что в данном обязательстве передана
плюс или минус единица.
На этих примерах мы хотим продемонстрировать, как класс
больших целых чисел, встроенный в Java^ можно использовать д^ля
создания наиболее продвинутых схем этой книги, которые не реали­
зованы в стандартных пакетах. Программа, приведенная ниже, не
использует возможностей ни SUN^ ни Cryptix JCE^ поэтому может
быть выполнена в рамках стандартного пакета Java.

Б . 5 . 1 . P a r a m e t e r s .Java
Первый класс просто содержит параметры домена д^ля нашей схемы
обязательств, которые, по суп1;еству, совпадают с открытым клю­
чом DSA.

import Java.security.*;
import j ava.security.interfaces.*;
import Java.math.Biglnteger;
class Parameters
{
private Biglnteger p,q,g,h;
public Parameters (SecureRandom random)
throws NoSuchAlgorithmException
{
Прилодюение Б. Примеры на языке Java

/ * Получаем параметры домена, инсталлированные SUN */
KeyPairGenerator KGen=KeyPairGenerator. get Instance ("DSA") ;
KGen.initialize(1024,random);
KeyPair p a i r = KGen.generateKeyPairO ;
DSAPublicKey pub=(DSAPublicKey) p a i r . g e t P u b l i c O ;
DSAParams Params=pub.getParams();
p=Params.getP()
q=Params.getQ()
g=Params.getG()
h=pub.getY();
}
public Biglnteger getPO { return p; }
public Biglnteger getQO { return q; }
public Biglnteger getGO { return g; }
public Biglnteger getHO { return h; }



Б.5.2. Private_Commitment.java
Второй класс содержит секретные величины, ассоциированные с
обязательством
В = С'Н'',


import Java.math.Biglnteger;
class Private_Commitment
{
private Biglnteger a,c,B;
private Parameters PK;
public Private-Commitment (Parameters P)
{ PK=P; }
public void assign(BigInteger al,Biglnteger bl,Biglnteger cl)
{ a=al; B=bl; c=cl; }
public Biglnteger getA() { return a; }
public Biglnteger getBO { return B; }
public Biglnteger getCO { return c; }
public Parameters get-Params() { return PK; }
}
Б.5. Доказательства с нулевым разглашением и обязательства 501

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

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

ОГЛАВЛЕНИЕ

Следующая >>