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 + -
显示快捷键?