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