despo_zenonos
03-20-2007, 02:55 PM
Hi,
I'm trying to blind a message, sign it and verify the signature.
So far I have:
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
public class MyBlind {
public static void main(String[] args) {
try {
//*********************** SETUP **********************************
RSAPublicKey pubKey;
RSAPrivateKey privKey;
//generate the RSA key pair
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
//initialise the KeyGenerator with a random number.
keyGen.initialize(1024, new SecureRandom());
KeyPair keypair = keyGen.genKeyPair();
privKey = (RSAPrivateKey)keypair.getPrivate();
pubKey = (RSAPublicKey)keypair.getPublic();
String message = "john smith";
byte [] raw = message.getBytes("UTF8");
BigInteger m = new BigInteger(raw);
BigInteger publicexpon = pubKey.getPublicExponent();
BigInteger privexpon = privKey.getPrivateExponent();
SecureRandom random = new SecureRandom();
byte [] randomBytes = new byte[10];
BigInteger r = null;
BigInteger pubmodulus = pubKey.getModulus();
BigInteger gcd = null;
BigInteger one = new BigInteger("1");
//check that gcd(r,n) = 1 && r < n && r > 1
do {
random.nextBytes(randomBytes);
r = new BigInteger(1, randomBytes);
gcd = r.gcd(pubmodulus);
System.out.println("gcd: " + gcd);
}
while(!gcd.equals(one) || r.compareTo(pubmodulus)>=0 || r.compareTo(one)<=0);
//********************* BLIND ************************************
BigInteger b = ((r.modPow(publicexpon,pubmodulus)).multiply(m)).mod(pubmodulus);
System.out.println("\nb = " + b);
//********************* SIGN *************************************
// generate a signature
Signature bs = Signature.getInstance("MD5/RSA", "BC");
bs.initSign(keypair.getPrivate(), random);
String message1 = b.toString();
byte[] bytes = new byte[message1.length()];
char[] chars = message1.toCharArray();
for (int i = 0; i != chars.length; i++)
{
bytes[i] = (byte)chars[i];
}
System.out.print(bytes);
bs.update(bytes);
byte[] sigBytes =bs.sign();
// verify a signature
bs.initVerify(pubKey);
bs.update(bytes);
if (bs.verify(sigBytes))
{
System.out.println("signature verification succeeded.");
}
else
{
System.out.println("signature verification failed.");
}
//********************* UNBLIND **********************************
BigInteger s = (b.multiply(r.modInverse(pubmodulus))).mod(pubmodulus);
System.out.println("s = " + s);
}
}
To be honest I really dont understand the maths, can anyone tell me if I'm doing it right?? I get all sort of different outputs, so I dont know what goes correct and what goes wrong :/
Thank you
I'm trying to blind a message, sign it and verify the signature.
So far I have:
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
public class MyBlind {
public static void main(String[] args) {
try {
//*********************** SETUP **********************************
RSAPublicKey pubKey;
RSAPrivateKey privKey;
//generate the RSA key pair
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
//initialise the KeyGenerator with a random number.
keyGen.initialize(1024, new SecureRandom());
KeyPair keypair = keyGen.genKeyPair();
privKey = (RSAPrivateKey)keypair.getPrivate();
pubKey = (RSAPublicKey)keypair.getPublic();
String message = "john smith";
byte [] raw = message.getBytes("UTF8");
BigInteger m = new BigInteger(raw);
BigInteger publicexpon = pubKey.getPublicExponent();
BigInteger privexpon = privKey.getPrivateExponent();
SecureRandom random = new SecureRandom();
byte [] randomBytes = new byte[10];
BigInteger r = null;
BigInteger pubmodulus = pubKey.getModulus();
BigInteger gcd = null;
BigInteger one = new BigInteger("1");
//check that gcd(r,n) = 1 && r < n && r > 1
do {
random.nextBytes(randomBytes);
r = new BigInteger(1, randomBytes);
gcd = r.gcd(pubmodulus);
System.out.println("gcd: " + gcd);
}
while(!gcd.equals(one) || r.compareTo(pubmodulus)>=0 || r.compareTo(one)<=0);
//********************* BLIND ************************************
BigInteger b = ((r.modPow(publicexpon,pubmodulus)).multiply(m)).mod(pubmodulus);
System.out.println("\nb = " + b);
//********************* SIGN *************************************
// generate a signature
Signature bs = Signature.getInstance("MD5/RSA", "BC");
bs.initSign(keypair.getPrivate(), random);
String message1 = b.toString();
byte[] bytes = new byte[message1.length()];
char[] chars = message1.toCharArray();
for (int i = 0; i != chars.length; i++)
{
bytes[i] = (byte)chars[i];
}
System.out.print(bytes);
bs.update(bytes);
byte[] sigBytes =bs.sign();
// verify a signature
bs.initVerify(pubKey);
bs.update(bytes);
if (bs.verify(sigBytes))
{
System.out.println("signature verification succeeded.");
}
else
{
System.out.println("signature verification failed.");
}
//********************* UNBLIND **********************************
BigInteger s = (b.multiply(r.modInverse(pubmodulus))).mod(pubmodulus);
System.out.println("s = " + s);
}
}
To be honest I really dont understand the maths, can anyone tell me if I'm doing it right?? I get all sort of different outputs, so I dont know what goes correct and what goes wrong :/
Thank you