import java.util.* ;
import java.math.BigInteger ;
class dsaAlg
{
{
while ( ! test.isProbablePrime ( 99 ) )
e:
{
test = test.add ( one) ;
}
return test;
}
{
while ( ! n.isProbablePrime ( 99 ) )
{
while ( ! ( ( n.mod ( start) ) .equals ( zero) ) )
{
start = start.add ( one) ;
}
n = n.divide ( start) ;
}
return n;
}
{
h = h.mod ( p) ;
return h.modPow ( ( p.subtract ( one) ) .divide ( q) , p) ;
}
public static void main
( String [ ] args
) throws {
BigInteger p
= getNextPrime
( "10600" ) ; /* approximate prime */
System .
out .
println ( " \n simulation of Digital Signature Algorithm \n " ) ; System .
out .
println ( " \n global public key components are:\n " ) ; System .
out .
println ( "\n p is: " + p
) ; System .
out .
println ( "\n q is: " + q
) ; System .
out .
println ( "\n g is: " + g
) ; x = x.mod ( q) ;
k = k.mod ( q) ;
BigInteger s
= kInv.
multiply ( hashVal.
add ( x.
multiply ( r
) ) ) ; s = s.mod ( q) ;
System .
out .
println ( "\n secret information are:\n " ) ; System .
out .
println ( "x (private) is:" + x
) ; System .
out .
println ( "k (secret) is: " + k
) ; System .
out .
println ( "y (public) is: " + y
) ; System .
out .
println ( "h (rndhash) is: " + hashVal
) ; System .
out .
println ( "\n generating digital signature:\n " ) ; System .
out .
println ( "r is : " + r
) ; System .
out .
println ( "s is : " + s
) ; BigInteger v
= ( g.
modPow ( u1,p
) ) .
multiply ( y.
modPow ( u2,p
) ) ; v = ( v.mod ( p) ) .mod ( q) ;
System .
out .
println ( "\n verifying digital signature (checkpoints)\n :" ) ; System .
out .
println ( "w is : " + w
) ;
System .
out .
println ( "u1 is : " + u1
) ; System .
out .
println ( "u2 is : " + u2
) ; System .
out .
println ( "v is : " + v
) ; if ( v.equals ( r) )
{
System .
out .
println ( "\n success: digital signature is verified!\n " + r
) ; }
else
{
System .
out .
println ( "\n error: incorrect digital signature\n " ) ; }
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CmNsYXNzIGRzYUFsZyAKeyAKZmluYWwgc3RhdGljIEJpZ0ludGVnZXIgb25lID0gbmV3IEJpZ0ludGVnZXIoIjEiKTsKZmluYWwgc3RhdGljIEJpZ0ludGVnZXIgemVybyA9IG5ldyBCaWdJbnRlZ2VyKCIwIik7IApwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgZ2V0TmV4dFByaW1lKFN0cmluZyBhbnMpCnsgCkJpZ0ludGVnZXIgdGVzdCA9IG5ldyBCaWdJbnRlZ2VyKGFucyk7CndoaWxlICghdGVzdC5pc1Byb2JhYmxlUHJpbWUoOTkpKQplOgp7IAkKdGVzdCA9IHRlc3QuYWRkKG9uZSk7Cn0gCnJldHVybiB0ZXN0Owp9CnB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciBmaW5kUShCaWdJbnRlZ2VyIG4pCnsgCkJpZ0ludGVnZXIgc3RhcnQgPSBuZXcgQmlnSW50ZWdlcigiMiIpOwp3aGlsZSAoIW4uaXNQcm9iYWJsZVByaW1lKDk5KSkKeyAKd2hpbGUgKCEoKG4ubW9kKHN0YXJ0KSkuZXF1YWxzKHplcm8pKSkKeyAKc3RhcnQgPSBzdGFydC5hZGQob25lKTsKfQpuID0gbi5kaXZpZGUoc3RhcnQpOyAKfQpyZXR1cm4gbjsgCn0KcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIGdldEdlbihCaWdJbnRlZ2VyIHAsIEJpZ0ludGVnZXIgcSxSYW5kb20gcikKeyAKQmlnSW50ZWdlciBoID0gbmV3IEJpZ0ludGVnZXIocC5iaXRMZW5ndGgoKSwgcik7CmggPSBoLm1vZChwKTsgCnJldHVybiBoLm1vZFBvdygocC5zdWJ0cmFjdChvbmUpKS5kaXZpZGUocSksIHApOwp9IApwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzCmphdmEubGFuZy5FeGNlcHRpb24gCnsKUmFuZG9tIHJhbmRPYmogPSBuZXcgUmFuZG9tKCk7IApCaWdJbnRlZ2VyIHAgPSBnZXROZXh0UHJpbWUoIjEwNjAwIik7IC8qIGFwcHJveGltYXRlCnByaW1lICovIApCaWdJbnRlZ2VyIHEgPSBmaW5kUShwLnN1YnRyYWN0KG9uZSkpOwpCaWdJbnRlZ2VyIGcgPSBnZXRHZW4ocCxxLHJhbmRPYmopOwpTeXN0ZW0ub3V0LnByaW50bG4oIiBcbiBzaW11bGF0aW9uIG9mIERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobSBcbiIpOwpTeXN0ZW0ub3V0LnByaW50bG4oIiBcbiBnbG9iYWwgcHVibGljIGtleSBjb21wb25lbnRzIGFyZTpcbiIpOwpTeXN0ZW0ub3V0LnByaW50bG4oIlxucCBpczogIiArIHApOwpTeXN0ZW0ub3V0LnByaW50bG4oIlxucSBpczogIiArIHEpOwpTeXN0ZW0ub3V0LnByaW50bG4oIlxuZyBpczogIiArIGcpOwpCaWdJbnRlZ2VyIHggPSBuZXcgQmlnSW50ZWdlcihxLmJpdExlbmd0aCgpLCByYW5kT2JqKTsKeCA9IHgubW9kKHEpOwpCaWdJbnRlZ2VyIHkgPSBnLm1vZFBvdyh4LHApOwpCaWdJbnRlZ2VyIGsgPSBuZXcgQmlnSW50ZWdlcihxLmJpdExlbmd0aCgpLCByYW5kT2JqKTsKayA9IGsubW9kKHEpOwpCaWdJbnRlZ2VyIHIgPSAoZy5tb2RQb3coayxwKSkubW9kKHEpOwpCaWdJbnRlZ2VyIGhhc2hWYWwgPSBuZXcgQmlnSW50ZWdlcihwLmJpdExlbmd0aCgpLHJhbmRPYmopOyAKQmlnSW50ZWdlciBrSW52ID0gay5tb2RJbnZlcnNlKHEpOwpCaWdJbnRlZ2VyIHMgPSBrSW52Lm11bHRpcGx5KGhhc2hWYWwuYWRkKHgubXVsdGlwbHkocikpKTsgCnMgPSBzLm1vZChxKTsKU3lzdGVtLm91dC5wcmludGxuKCJcbnNlY3JldCBpbmZvcm1hdGlvbiBhcmU6XG4iKTsKU3lzdGVtLm91dC5wcmludGxuKCJ4IChwcml2YXRlKSBpczoiICsgeCk7IApTeXN0ZW0ub3V0LnByaW50bG4oImsgKHNlY3JldCkgaXM6ICIgKyBrKTsKU3lzdGVtLm91dC5wcmludGxuKCJ5IChwdWJsaWMpIGlzOiAiICsgeSk7ClN5c3RlbS5vdXQucHJpbnRsbigiaCAocm5kaGFzaCkgaXM6ICIgKyBoYXNoVmFsKTsKU3lzdGVtLm91dC5wcmludGxuKCJcbiBnZW5lcmF0aW5nIGRpZ2l0YWwgc2lnbmF0dXJlOlxuIik7ClN5c3RlbS5vdXQucHJpbnRsbigiciBpcyA6ICIgKyByKTsKU3lzdGVtLm91dC5wcmludGxuKCJzIGlzIDogIiArIHMpOwpCaWdJbnRlZ2VyIHcgPSBzLm1vZEludmVyc2UocSk7CkJpZ0ludGVnZXIgdTEgPSAoaGFzaFZhbC5tdWx0aXBseSh3KSkubW9kKHEpOwpCaWdJbnRlZ2VyIHUyID0gKHIubXVsdGlwbHkodykpLm1vZChxKTsKQmlnSW50ZWdlciB2ID0gKGcubW9kUG93KHUxLHApKS5tdWx0aXBseSh5Lm1vZFBvdyh1MixwKSk7CnYgPSAodi5tb2QocCkpLm1vZChxKTsKU3lzdGVtLm91dC5wcmludGxuKCJcbnZlcmlmeWluZyBkaWdpdGFsIHNpZ25hdHVyZSAoY2hlY2twb2ludHMpXG46Iik7IApTeXN0ZW0ub3V0LnByaW50bG4oIncgaXMgOiAiICsgdyk7CgpTeXN0ZW0ub3V0LnByaW50bG4oInUxIGlzIDogIiArIHUxKTsKU3lzdGVtLm91dC5wcmludGxuKCJ1MiBpcyA6ICIgKyB1Mik7ClN5c3RlbS5vdXQucHJpbnRsbigidiBpcyA6ICIgKyB2KTsgCmlmICh2LmVxdWFscyhyKSkKewpTeXN0ZW0ub3V0LnByaW50bG4oIlxuc3VjY2VzczogZGlnaXRhbCBzaWduYXR1cmUgaXMgdmVyaWZpZWQhXG4gIiArIHIpOwp9CmVsc2UKewpTeXN0ZW0ub3V0LnByaW50bG4oIlxuIGVycm9yOiBpbmNvcnJlY3QgZGlnaXRhbCBzaWduYXR1cmVcbiAiKTsKfQp9Cn0K