All Downloads are FREE. Search and download functionalities are using the official Maven repository.

at.chrl.nutils.ncrypt.EncryptedRSAKeyPair Maven / Gradle / Ivy

The newest version!
/*
 * This file is part of Aion-Finish 
 * 
 * Aion-Finish 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-Finish 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-Finish. If not, see .
 */
package at.chrl.nutils.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;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy