webForumDet fria alternativet

(de)kryptering med asymmetriska nycklar

3 svar · 356 visningar · startad av Viktor

ViktorMedlem sedan aug. 20021 752 inlägg
#1

Hur gör man för att (de)kryptera ett medelande i java med hjälp av asymmetriska nyckler? RSA, DSA eller liknande.
Vad jag vill göra är att klienten först kontaktar servern med hjälp av serverns publika nyckel, klienten skickar med sin publika nyckel och servern genererar en symmetrisk nyckel (AES) och skickar den till klienten krypterad med klientens publika nyckel.
Så frågan är, hur (de)kryptera med RSA, DSA eller liknande i Java?

/Viktor

phonkworksMedlem sedan juli 2001228 inlägg
#2

Tjena!

Kolla om du hittar nåt här:
http://www.cryptix.org/

mvh
phonk

sgtpepperMedlem sedan apr. 20007 588 inlägg
#3

Kika på Security and the Java Platform och specifikt Java Cryptography Extension (JCE).

JCE har stöd för DES och AES (och en mängd andra algoritmer) i den defaultprovider (SunJCE) som följer med, vill man köra RSA eller andra algoritmer så finns det andra providers, bla IBM JCE eller Cryptix JCE (se phonkworks inlägg).

ViktorMedlem sedan aug. 20021 752 inlägg
#4

Tack för hjälpen :bire
Har inte hunnit hugga in djupare i det, men jag har fått fram följade test program som ser ut att fungera perfekt och göra det som jag vill att den ska göra,

import java.util.*;
import java.security.*;
import java.security.interfaces.*;
import java.security.cert.*;
import java.security.spec.*;
import javax.crypto.*;
import cryptix.jce.provider.rsa.*;
import cryptix.jce.provider.key.*;
import cryptix.jce.provider.CryptixCrypto;

public class Crypt
{
	public static void main(String args[])
	{
		addProviderCryptix();
		new Crypt();
	}

	/**
	* Add provider cryptix dynamicly. Due to the fact that each provider has 
	* its own location for the provider class I do not know how to create 
	* different provider instances dynamicly. E.g. one function for raising 
	* ABA, Cryptix, Forge or Entrust provider. But the few providers can be 
	* hardcoded, I think.
	*/
	private static boolean addProviderCryptix() 
	{
		// First add the provider (in this case cryptix) dynamicly to the 
		// provider list. If this should be staticly edit the java.security 
		// file and add the line:
		//    security.provider.X=cryptix.jce.provider.Cryptix
		// where X specifies the desired priority of the provider in the 
		// provider list.

		// create a new Cryptix provider.
		Provider cryptix_provider = new CryptixCrypto();

		// Result either returns the position of the provider or -1 if the 
		// provider already exists.
		//
		// If you want to add the provider at a specific position run:
		// int position=2; // insert at position 2.
		// result=Security.insertProviderAt(cryptix_provider, position);
		int result=Security.addProvider(cryptix_provider);

		if (result==-1)
		{
			System.out.println("Provider entry already in file.\n");
			return false;
		}
		else 
		{
			System.out.println("Provider added at position: "+result);
			return true;
		}
	}

	public Crypt()
	{
		KeyPair kp=createRSAKeyPair();
		try
		{
			String str="This is a test message";
			System.out.println("Message 1: "+str);
			javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("RSA/ECB/PKCS#1");
			cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, kp.getPublic());
			byte [] encSK = cipher.doFinal(str.getBytes());
			System.out.println("Message 2: "+new String(encSK));

			cipher = javax.crypto.Cipher.getInstance("RSA/ECB/PKCS#1");
			cipher.init(javax.crypto.Cipher.DECRYPT_MODE, kp.getPrivate());
			byte [] decSK = cipher.doFinal(encSK);
			str=new String(decSK);
			System.out.println("Message 3: "+str);
		}
		catch(Exception e)
		{
			e.printStackTrace(System.err);
		}
		System.out.println("Finish!");
	}

	/**
	* Generate a RSA keypair.
	* 
	* @return The generated keypair or null.
	*/
	private KeyPair createRSAKeyPair()
	{
		try
		{
			KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
			SecureRandom securerandom = SecureRandom.getInstance("SHA1PRNG", "SUN");
			kpg.initialize(1024, securerandom);
			return(kpg.generateKeyPair());
		}
		catch(NoSuchProviderException nspe)
		{
			nspe.printStackTrace(System.err);
			return(null);
		}
		catch(NoSuchAlgorithmException nsae)
		{
			nsae.printStackTrace(System.err);
			return(null);
		}
	}
}

/Viktor

131 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)