encrypt1_4.java

来自「JGRoups源码」· Java 代码 · 共 555 行 · 第 1/2 页

JAVA
555
字号
// changes made by mandar// Added .* imports// replacing SecretKey with SecretKey// $Id: ENCRYPT1_4.java,v 1.1 2006/03/10 15:09:46 belaban Exp $package org.jgroups.protocols.obsolete;import org.jgroups.Address;import org.jgroups.Event;import org.jgroups.Message;import org.jgroups.View;import org.jgroups.protocols.PingRsp;import org.jgroups.stack.Protocol;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.SecretKeySpec;import java.io.IOException;import java.security.*;import java.security.spec.X509EncodedKeySpec;import java.util.Properties;import java.util.Vector;/** * ENCRYPT1_4 layer. Encrypt and decrypt the group communication in JGroups */public class ENCRYPT1_4 extends Protocol {public static class EncryptHeader extends org.jgroups.Header {    int type;    static final int ENCRYPT=0;    static final int KEY_REQUEST=1;    static final int SERVER_PUBKEY=2;    static final int SECRETKEY=3;    static final int SECRETKEY_READY=4;    // adding key for Message object purpose    static final String KEY="encrypt";    public EncryptHeader(){}    public EncryptHeader(int type) {        this.type=type;    }    public void writeExternal(java.io.ObjectOutput out) throws IOException {        out.writeInt(type);    }    public void readExternal(java.io.ObjectInput in) throws IOException, ClassNotFoundException {        type=in.readInt();    }    public String toString() {        return "[ENCTYPT: <variables> ]";    }}    Address local_addr=null;    Address keyServerAddr=null;    boolean keyServer=false;    String asymAlgorithm="RSA";    String symAlgorithm="DES/ECB/PKCS5Padding";    int asymInit=512;					// initial public/private key length    int symInit=56;					// initial shared key length    // for public/private Key    KeyPair Kpair;			// to store own's public/private Key    SecretKey desKey=null;    final PublicKey pubKey=null;               // for server to store the temporary client public key    PublicKey serverPubKey=null;         // for client to store server's public Key    Cipher cipher;    Cipher rsa;    final Vector members=new Vector();    final Vector notReady=new Vector();    public ENCRYPT1_4() {        //Provider prov = Security.getProvider("SUN");        //Security.addProvider(prov);    }    public String getName() {        return "ENCRYPT1_4";    }    /*     * GetAlgorithm: Get the algorithm name from "algorithm/mode/padding"     */    private static String getAlgorithm(String s) {        int index=s.indexOf("/");        if(index == -1)            return s;        return s.substring(0, index);    }    public boolean setProperties(Properties props) {        String str;        super.setProperties(props);        // asymmetric key length        str=props.getProperty("asymInit");        if(str != null) {            asymInit=Integer.parseInt(str);            props.remove("asymInit");		if(log.isInfoEnabled()) log.info("Asym algo bits used is " + asymInit);        }        // symmetric key length        str=props.getProperty("symInit");        if(str != null) {            symInit=Integer.parseInt(str);            props.remove("symInit");		if(log.isInfoEnabled()) log.info("Sym algo bits used is " + symInit);        }        // asymmetric algorithm name        str=props.getProperty("asymAlgorithm");        if(str != null) {            asymAlgorithm=str;            props.remove("asymAlgorithm");		if(log.isInfoEnabled()) log.info("Asym algo used is " + asymAlgorithm);        }        // symmetric algorithm name        str=props.getProperty("symAlgorithm");        if(str != null) {            symAlgorithm=str;            props.remove("symAlgorithm");		if(log.isInfoEnabled()) log.info("Sym algo used is " + symAlgorithm);        }        if(props.size() > 0) {		if(log.isErrorEnabled()) log.error("these properties are not recognized: " + props);            return false;        }        return true;    }    public void init() throws Exception {        // generate keys according to the specified algorithms        // generate publicKey and Private Key using RSA        KeyPairGenerator KpairGen=KeyPairGenerator.getInstance(getAlgorithm(asymAlgorithm));        KpairGen.initialize(asymInit, new SecureRandom());        Kpair=KpairGen.generateKeyPair();        // generate secret key        KeyGenerator keyGen=KeyGenerator.getInstance(getAlgorithm(symAlgorithm));        keyGen.init(symInit);        desKey=keyGen.generateKey();        // initialize for rsa, cipher encryption/decryption        rsa=Cipher.getInstance(asymAlgorithm);        cipher=Cipher.getInstance(symAlgorithm);	    if(log.isInfoEnabled()) log.info(" Both asym and sym algo initialized with the single shared key");    }    /** Just remove if you don't need to reset any state */    public static void reset() {    }    public void up(Event evt) {        Message msg;        Message newMsg;        EncryptHeader hdr;	    if(log.isInfoEnabled()) log.info("Event going up is " + evt);        switch(evt.getType()) {            case Event.SET_LOCAL_ADDRESS:		    if(log.isInfoEnabled()) log.info("Set address call");                local_addr=(Address)evt.getArg();                break;            case Event.FIND_INITIAL_MBRS_OK:                Vector member=(Vector)evt.getArg();		    if(log.isInfoEnabled()) log.info("FIND_INIT members call, left members are " + member.size());				// this check is required, to prevent keyServer= false when adding itself		if (!keyServer)		    keyServer=member.size() <= 0;		                if(member != null && member.size() > 0)                    keyServerAddr=((PingRsp) member.firstElement()).coord_addr;                else                    keyServerAddr=local_addr;                if(!keyServer) 		    {						desKey=null;			    if(log.isDebugEnabled()) log.debug("This is not keyserver, deskey set to null");			// client send clien's public key to server and request server's public key			newMsg=new Message(keyServerAddr, local_addr, Kpair.getPublic().getEncoded());			// making changes (MANDAR)			newMsg.putHeader(EncryptHeader.KEY, new EncryptHeader(EncryptHeader.KEY_REQUEST));			passDown(new Event(Event.MSG, newMsg));		    }		    if(log.isInfoEnabled()) log.info("Done parsing for encrypt headers, sending upwards" + evt);		passUp(evt);                return;            case Event.MSG:                msg=(Message) evt.getArg();		    if(log.isInfoEnabled()) log.info("This is a message from peer, not control header" + msg);                // making changes (MANDAR)                if(msg == null) {			if(log.isDebugEnabled()) log.debug("Null message");                    passUp(evt);                    return;                }                // making changes (MANDAR)                //Object obj=msg.peekHeader();                Object obj=msg.removeHeader(EncryptHeader.KEY);		    if(log.isInfoEnabled()) log.info("Stripping the required protocol header");                // if not encrypted message, pass up                if(obj == null || !(obj instanceof EncryptHeader)) {			if(log.isInfoEnabled()) log.info("Dropping package as ENCRYPT1_4 protocol is not been recognized, msg will not be passed up");		    // BELA comment this out in case U think otherwise                    //passUp(evt);                    return;                }                // making changes (MANDAR)                //hdr = (EncryptHeader)msg.removeHeader();                hdr=(EncryptHeader) obj;		    if(log.isInfoEnabled()) log.info("Header received " + hdr + ':' + hdr.type);                switch(hdr.type) {                    // key request from client and send server's public key to client                    case EncryptHeader.KEY_REQUEST:                        try {				if(log.isDebugEnabled()) log.debug("Request for key");                            // store the this client to notReady list using client's address                            notReady.addElement(msg.getSrc());                            // store the client's public key for temporary                            PublicKey tmpPubKey=generatePubKey(msg.getBuffer());				if(log.isDebugEnabled()) log.debug("Generated requestors public key");                            // send server's publicKey                            newMsg=new Message(msg.getSrc(), local_addr, Kpair.getPublic().getEncoded());                            // making changes (MANDAR)                            newMsg.putHeader(EncryptHeader.KEY, new EncryptHeader(EncryptHeader.SERVER_PUBKEY));				if(log.isDebugEnabled()) log.debug("Encoded servers public key using clients public key, only client can debug it using its private key and sending it back");                            passDown(new Event(Event.MSG, newMsg));

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?