//Copyright 2007-2008 David Yu dyuproject@gmail.com
//------------------------------------------------------------------------
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//http://www.apache.org/licenses/LICENSE-2.0
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
//package com.dyuproject.util;
import java.math.BigInteger;
/**
*
* Diffie-Hellman key exchange is a cryptographic protocol that allows two parties
* that have no prior knowledge of each other to jointly establish a shared secret
* key over an insecure communications channel.
*
* @author David Yu
* @created Sep 7, 2008
*/
public final class DiffieHellman
{
public static final DiffieHellman BASE_2 = new DiffieHellman(BigInteger.valueOf(2));
public static final DiffieHellman BASE_5 = new DiffieHellman(BigInteger.valueOf(5));
private static final long __loadTime = System.currentTimeMillis();
private final BigInteger _base;
public DiffieHellman(BigInteger base)
{
_base = base;
}
/**
* Generates a random private Key (element 0) and a random public key (element 1)
* from the given {@code modulus}.
*
* @param modulus
* @return BigInteger array. Element 0 is privateKey. Element 1 is publicKey.
*/
public BigInteger[] generateRandomKeys(BigInteger modulus)
{
BigInteger privateKey = BigInteger.valueOf(System.currentTimeMillis() + __loadTime);
return new BigInteger[]{privateKey, generatePublicKey(privateKey, modulus)};
}
/**
* Generates a public key from the given {@code privateKey} and {@code modulus}.
*/
public BigInteger generatePublicKey(BigInteger privateKey, BigInteger modulus)
{
return _base.modPow(privateKey, modulus);
}
/**
* Gets/computes the shared secret key from the given {@code privateKey},
* {@code modulus} and {@code responseKey} - which is a public key.
*/
public static BigInteger getSharedSecretKey(BigInteger privateKey, BigInteger modulus,
BigInteger responseKey)
{
return responseKey.modPow(privateKey, modulus);
}
}
/*
//Copyright 2007-2008 David Yu dyuproject@gmail.com
//------------------------------------------------------------------------
//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//http://www.apache.org/licenses/LICENSE-2.0
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
package com.dyuproject.util;
import java.math.BigInteger;
import junit.framework.TestCase;
// * @author David Yu
// * @created Sep 8, 2008
public class DiffieHellmanTest extends TestCase
{
public void testSharedSecret()
{
//from http://en.wikipedia.org/wiki/Diffie-Hellman
BigInteger modulus = BigInteger.valueOf(23);
BigInteger a_private = BigInteger.valueOf(6);
BigInteger a_public = DiffieHellman.BASE_5.generatePublicKey(a_private, modulus);
BigInteger b_private = BigInteger.valueOf(15);
BigInteger b_public = DiffieHellman.BASE_5.generatePublicKey(b_private, modulus);
BigInteger a_shared_secret = DiffieHellman.getSharedSecretKey(a_private, modulus, b_public);
BigInteger b_shared_secret = DiffieHellman.getSharedSecretKey(b_private, modulus, a_public);
assertEquals(a_shared_secret, b_shared_secret);
assertEquals(2, a_shared_secret.intValue());
}
}
*/