/**
* This file is part of aion-emu <aion-emu.com>.
*
* aion-emu is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* aion-emu is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with aion-emu. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aionemu.loginserver.network.ncrypt;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.interfaces.RSAPublicKey;
/**
* This class is for storing standard RSA Public/Static keyPairs
* The main difference that N (Modulus) is encrypted to be transfered
* on the net with simple scrambling algorythm. So public pair (e, n)
* , where e is exponent (usually static 3 or 65537) and n is modulus,
* is encrypted and cannot be applied to cipher some data without deciphering
* the modulus.
*
* @author EvilSpirit
*/
public class EncryptedRSAKeyPair
{
/**
* KeyPair
*/
private KeyPair RSAKeyPair;
/**
* Byte
*/
private byte[] encryptedModulus;
/**
* Default constructor. Stores RSA key pair and encrypts rsa modulus N
* @param RSAKeyPair standard RSA KeyPair generated
* with standard KeyPairGenerator {@link java.security.KeyPairGenerator}
*/
public EncryptedRSAKeyPair(KeyPair RSAKeyPair)
{
this.RSAKeyPair = RSAKeyPair;
encryptedModulus = encryptModulus(((RSAPublicKey) this.RSAKeyPair.getPublic()).getModulus());
}
/**
* Encrypt RSA modulus N
* @param modulus RSA modulus from public/private pairs (e,n), (d,n)
* @return encrypted modulus
*/
private byte[] encryptModulus(BigInteger modulus)
{
byte[] encryptedModulus = modulus.toByteArray();
if((encryptedModulus.length == 0x81) && (encryptedModulus[0] == 0x00))
{
byte[] temp = new byte[0x80];
System.arraycopy(encryptedModulus, 1, temp, 0, 0x80);
encryptedModulus = temp;
}
for(int i = 0; i < 4; i++)
{
byte temp = encryptedModulus[i];
encryptedModulus[i] = encryptedModulus[0x4d + i];
encryptedModulus[0x4d + i] = temp;
}
for(int i = 0; i < 0x40; i++)
{
encryptedModulus[i] = (byte) (encryptedModulus[i] ^ encryptedModulus[0x40 + i]);
}
for(int i = 0; i < 4; i++)
{
encryptedModulus[0x0d + i] = (byte) (encryptedModulus[0x0d + i] ^ encryptedModulus[0x34 + i]);
}
for(int i = 0; i < 0x40; i++)
{
encryptedModulus[0x40 + i] = (byte) (encryptedModulus[0x40 + i] ^ encryptedModulus[i]);
}
return encryptedModulus;
}
/**
* Get default RSA key pair
* @return RSAKeyPair
*/
public KeyPair getRSAKeyPair()
{
return RSAKeyPair;
}
/**
* Get encrypted modulus to be transferred on the net.
* @return encryptedModulus
*/
public byte[] getEncryptedModulus()
{
return encryptedModulus;
}
}