encrypt1_4.java

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

JAVA
555
字号
			    // my changes (MANDAR)			    rsa.init(Cipher.ENCRYPT_MODE, tmpPubKey);			    byte[] encryptedKey = rsa.doFinal(desKey.getEncoded());				if(log.isDebugEnabled()) log.debug(" Generated encoded key which only client can decode");			                                // send shared DesKey to client                            //   1. Decrypt desKey with server's own private Key                            //   2. Encrypt decrypted desKey with client's own public Key                            // encrypt encoded desKey using server's private key			    /*                            rsa.init(Cipher.ENCRYPT_MODE, Kpair.getPrivate());                            byte[] decryptedKey=rsa.doFinal(desKey.getEncoded());                            // encrypt decrypted key using client's public key                            rsa.init(Cipher.ENCRYPT_MODE, pubKey);                            byte[] encryptedKey=rsa.doFinal(decryptedKey);			    */                            //send encrypted deskey to client			                                newMsg=new Message(msg.getSrc(), local_addr, encryptedKey);                            // making changes (MANDAR)                            newMsg.putHeader(EncryptHeader.KEY, new EncryptHeader(EncryptHeader.SECRETKEY));				if(log.isDebugEnabled()) log.debug(" Sending encoded key to client");                            passDown(new Event(Event.MSG, newMsg));                        }                        catch(Exception e) {                            e.printStackTrace();                            System.out.println(e + "0");                        }                        return;                    case EncryptHeader.SECRETKEY_READY:						                        //server get client's public key and generate the secret key                        notReady.removeElement(msg.getSrc());			    if(log.isDebugEnabled()) log.debug("Removed client " + msg.getSrc() + "from notready list");                        return;                    case EncryptHeader.SERVER_PUBKEY:                        serverPubKey=generatePubKey(msg.getBuffer());			    if(log.isDebugEnabled()) log.debug(" Obtained the servers public key");                        return;                    case EncryptHeader.SECRETKEY:                        try {                            // decrypt using client's private Key                            rsa.init(Cipher.DECRYPT_MODE, Kpair.getPrivate());			    // my changes (MANDAR)			    byte[] encodedKey = rsa.doFinal(msg.getBuffer());				if(log.isDebugEnabled()) log.debug("generating encoded key obtained from server-admin");			    			    /* Piece commented out by MANDAR                             byte[] decryptedKey=rsa.doFinal(msg.getBuffer());			                                // decrypt using server's public Key                            rsa.init(Cipher.DECRYPT_MODE, serverPubKey);                            byte[] encodedKey=rsa.doFinal(decryptedKey);			    */                            // decode secretKey                            desKey=decodedKey(encodedKey);                            if(desKey == null)                                log.error("ohh oh !! DES key is null");				                                // send ready message (MANDAR) null -> ""                            newMsg=new Message(msg.getSrc(), local_addr, null);                            // making changes (MANDAR)                            newMsg.putHeader(EncryptHeader.KEY, new EncryptHeader(EncryptHeader.SECRETKEY_READY));                            passDown(new Event(Event.MSG, newMsg));				if(log.isDebugEnabled()) log.debug("Got the deskey, sending down sec_Ready header");                        }                        catch(Exception e) {                            e.printStackTrace();                            System.out.println(e + "5");                        }                        return;                    default:                        break;                }                if (hdr.type != 0)                    log.error("Error , header is not 0");                // not have shared key yet                // this encrypted message is of no use, drop it                if(desKey == null) return;		    if(log.isInfoEnabled()) log.info(" Starting to decypher messages");                // if both the shared key and incoming message are not null                // decrypt the message                if(msg.getBuffer() != null) {                    try {                        cipher.init(Cipher.DECRYPT_MODE, desKey);                        msg.setBuffer(cipher.doFinal(msg.getBuffer()));                    }                    catch(Exception e) {			e.printStackTrace();			                    }                }                break;        }	    if(log.isInfoEnabled()) log.info("Passing up event");        passUp(evt);            // Pass up to the layer above us    }    public void down(Event evt) {        Message msg;        Message newMsg;        boolean leave=false;        if(log.isInfoEnabled()) log.info("down:evt is " + evt + ':' + evt.getType());        switch(evt.getType()) {	            case Event.VIEW_CHANGE:            if(log.isInfoEnabled()) log.info("View change call, new member coming in");            Vector new_members=((View)evt.getArg()).getMembers();            // member size decreases: member leaves, need a new key            if(members.size() > new_members.size()) leave=true;            // copy member list            synchronized(members) {                members.removeAllElements();                if(new_members != null && new_members.size() > 0)                    for(int i=0; i < new_members.size(); i++)                        members.addElement(new_members.elementAt(i));            }// end of sync            // redistribute/regain the new key because old member leaves            if(leave) {                // get coordinator address                Object obj=members.firstElement();                // if I'm the coordinator/key-server                if(obj.equals(local_addr)) {                    //create the new shared key and distribute                    keyServer=true;                    keyServerAddr=local_addr;                    // reset shared key                    desKey=null;                    if(log.isInfoEnabled()) log.info(" leave caused deskey to be null ");                    try {                        //generate new shared key                        KeyGenerator keyGen=KeyGenerator.getInstance(getAlgorithm(symAlgorithm));                        keyGen.init(symInit);                        desKey=keyGen.generateKey();                    }                    catch(Exception e) {                        e.printStackTrace();                    }                }//end of local_addr == obj                // if I'm not the coordinator/key-server                else {                    keyServer=false;                    keyServerAddr=(Address)obj;                    // reset shared key                    desKey=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.isDebugEnabled()) log.debug("Requesting new key to be part of group");                } // end of else            }            break;        case Event.MSG:            msg= (Message) evt.getArg();            if(log.isDebugEnabled()) log.debug("Its a message call " + msg);            int i;		            // For Server:            // if some members don't have the shared key yet            if(!notReady.isEmpty())            {                System.out.println("not Ready list  :" + notReady.toString());                if(msg.getDest() == null) {                    for(i=0; i < notReady.size(); i++) {                        // making changes (MANDAR)                        newMsg=new Message((Address)notReady.elementAt(i), local_addr, msg.getBuffer());                        passDown(new Event(Event.MSG, newMsg));                    }                    break;                }                else                {                    for(i=0; i < notReady.size(); i++) {                        if(msg.getDest().equals(notReady.elementAt(i))) {                            passDown(evt);                            return;                        }// end of if..                    }// end of for..                }// end of else            }		            // I already know the shared key            if(desKey != null)            {                if(log.isInfoEnabled()) log.info("DESkey is not null, I know it ");                try                {                    // if the message is not empty, encrypt it                    if(msg.getBuffer() != null)                    {                        cipher.init(Cipher.ENCRYPT_MODE, desKey);                        msg.setBuffer(cipher.doFinal(msg.getBuffer()));                        msg.putHeader(EncryptHeader.KEY, new EncryptHeader(0));                        if(log.isInfoEnabled()) log.info(" have DES key , package sent");                    }                    else                    {                        msg.setBuffer(null);                        msg.putHeader(EncryptHeader.KEY, new EncryptHeader(0));                        if(log.isInfoEnabled()) log.info(" buffer null, added header");                    }                }catch(Exception e)                {                    e.printStackTrace();                }            }            break;        }// check des key..        if(log.isInfoEnabled()) log.info("Pass Down: " + evt.toString());        passDown(evt);          // Pass on to the layer below us    }    private SecretKey decodedKey(byte[] encodedKey) {        SecretKey key=null;        try {            //change needed mandar            SecretKeyFactory KeyFac=SecretKeyFactory.getInstance(getAlgorithm(symAlgorithm));            SecretKeySpec desKeySpec=new SecretKeySpec(encodedKey, getAlgorithm(symAlgorithm));            key=KeyFac.generateSecret(desKeySpec);        }        catch(Exception e) {            e.printStackTrace();        }        return key;    }    private PublicKey generatePubKey(byte[] encodedKey) {        PublicKey tmpPubKey=null;        try {            KeyFactory KeyFac=KeyFactory.getInstance(getAlgorithm(asymAlgorithm));            X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(encodedKey);            tmpPubKey=KeyFac.generatePublic(x509KeySpec);        }        catch(Exception e) {            e.printStackTrace();        }        return tmpPubKey;    }}

⌨️ 快捷键说明

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