un po' di codice :

così leggevo l'id di windows ci vuole una libreria apposta (jRegistryKey.dll)
ma tu cmq l'id della macchina ce l'hai già

codice:
winID = controlloAccesso.letturaID("SOFTWARE\\Microsoft\\Windows\\CurrentVersion","ProductId");

winIDCrypt = controlloAccesso.encode(winID);
lo criptavo in un modo banale

codice:
	// FUNZIONE PER ENCODE DI UNA STRINGA
	public String encode(String stringToEncode){
		String returnValue = "";
		BASE64Encoder encrypt = new BASE64Encoder();
		try{
			String codedString = encrypt.encode(stringToEncode.getBytes());
			returnValue = codedString;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return returnValue;
	}
il cliente mi diceva che siccome il programma non era registrato gli compariva il codice a video (quello appena criptato)

io gli generavo una chiave da quel codice con una funzione come questa e gliela fornivo

codice:
	public String createKeyById(String cryptID){
		
		String returnKey = "";
		String singleChar;
		int number = 0;
		int somma = 0;
		boolean sommaNumeri = false;
		
		String winID = decode(cryptID);
		
		// CONTROLLO LUNGHEZZA DEVE ESSERE PARI
		if (winID.length() % 2 == 0){
		}else{
			winID = winID + "0";
		}
		
		// CICLO PER LA COSTRUZIONE DELLA KEY
		for(int i=0;i<winID.length();i++){
			
			// RECUPERO CARATTERE
			singleChar = String.valueOf(winID.charAt(i));
			
			// CONTROLLO / CONVERSIONE IN NUMERO 
			try{
				number = Integer.parseInt(singleChar);
			}catch(Exception e){
				number = 0;
			}
			
			// SOMMA DEI NUMERI
			if(sommaNumeri==false){
				somma = number;
				sommaNumeri = true;
			}else{
				somma = somma + number;
				returnKey = returnKey + String.valueOf(somma);
				sommaNumeri = false;
			}
			
		}
		
		// CRYPT DELLA CHIAVE DI RITORNO
		if(returnKey.equalsIgnoreCase("")){
		}else{
			returnKey = encode(returnKey);
		}
		return returnKey;
		
	}
il cliente la inseriva (dove decidi tu, io lo mettevo in un file di configurazione)

ad ogni avvio il programma fa la stessa operazione che ho fatto io a mano e confronta se il codice del file di configurazione coincide.. se tutto ok prosegue..