⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientsend.java~1~

📁 JAVA实现的可以采用公钥私钥加密解密程序
💻 JAVA~1~
字号:
 import java.security.Provider;
  import java.security.*;
 import java.security.spec.*;
 import java.io.*;
 import javax.crypto.*;
 import javax.crypto.Cipher;
 
 public class ClientSend extends Thread{
 
 public static void main(String[] args){
   ClientSend my=new ClientSend();
   String file="info.dat";
    my.run(file);
  }
  
  //生成一对文件myprikey.dat和mypubkey.dat---私钥和公钥,
  //公钥要用户发送(文件,网络等方法)给其它用户,私钥保存在本地
  public boolean generatekey()
  {
    try {
    KeyPairGenerator  keygen=KeyPairGenerator.getInstance("RSA");
    keygen.initialize(1024);  //密钥大小
   // KeyPair keys=keygen.genKeyPair();
    KeyPair keys=keygen.generateKeyPair(); //生成密钥组
    PublicKey pubkey=keys.getPublic();
    PrivateKey prikey=keys.getPrivate();

    ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("MyPrikey.dat"));
    out.writeObject(prikey);
    out.close();
    System.out.println("写入对象 prikeys ok");
    
   /* 将公钥pubKey保存在文件pubKey.dat文件中,供接收方使用*/ 
    out=new ObjectOutputStream(new FileOutputStream("MyPubkey.dat"));
    out.writeObject(pubkey);
    out.close();
    System.out.println("写入对象 pubkeys ok");
    
    System.out.println("生成密钥对成功");
    return true;
   }
   catch (java.lang.Exception e) {
   e.printStackTrace();
   System.out.println("生成密钥对失败");
   return false;
   }
   
  }
  
   public String byte2hex(byte[] b)
    {
     String hs="";
     String stmp="";
     for (int n=0;n<b.length;n++)
      {
       stmp=(Integer.toHexString(b[n] & 0XFF));
       if (stmp.length()==1) hs=hs+"0"+stmp;
       else hs=hs+stmp;
       if (n<b.length-1)  hs=hs+":";
      }
     return hs.toUpperCase();
    }
    
 
  
  public void run(String filename)
  { 
     Security.addProvider(new com.sun.crypto.provider.SunJCE());
  	 //第一步生成密钥对,如果已经生成过,本过程就可以跳过,对用户来讲myprikey.dat要保存在本地
  //而mypubkey.dat给发布给其它用户
     if ((new File("MyPrikey.dat")).exists()==false) {
        if (generatekey()==false) {
           System.out.println("生成密钥对失败");
           return;
          }
        }
        
     try {
     		
     //从文件中读取私要进行签名
     ObjectInputStream in=new ObjectInputStream(new FileInputStream("MyPrikey.dat"));
     PrivateKey priKey=(PrivateKey)in.readObject();
     in.close();   
      System.out.println("读私钥");
     
    
     /*生成DES算法的密钥Key*/
    
     KeyGenerator SinglekeyGen = KeyGenerator.getInstance("DES");
     SinglekeyGen.init(56);
     Key SingleKey = SinglekeyGen.generateKey();
	 System.out.println("生成DES对称密钥");
     
  	  /*从文件info.dat读出需要传输的原始数据并保存在数组info_Plain[]中*/
     RandomAccessFile fin=new RandomAccessFile(filename,"rw");//以只读形式打开文件
     long f1=fin.length();   //文件的长度
     int  f2=(int)f1; 
     byte[] info_Plain=new byte[f2];   //建一个字节数组b存放文件
     fin.read(info_Plain,0,f2); 
     fin.close();
    
     System.out.println("原文件信息:"+new String(info_Plain));
  //  System.out.println("原文件二进制信息:"+byte2hex(info_Plain));
     
     
     /* 将待传输的信息用DES加密,并将加密后的数据保存在数组Des_info[]中*/
     Cipher cipher = Cipher.getInstance("DES");
     cipher.init(Cipher.ENCRYPT_MODE,SingleKey);
     byte[] Des_info= cipher.doFinal(info_Plain);
     System.out.println("加密成功");
    // System.out.println("明文加密后得到的信息:"+byte2hex(Des_info));
     
     /*将待传输的原始信息生成消息摘要MD_1*/
     MessageDigest messageDigest = MessageDigest.getInstance("MD5");
     messageDigest.update(info_Plain);
	 byte[] MD_1 = messageDigest.digest();   //得到消息的摘要MD_1里
	 System.out.println("消息摘要生成成功");
	// System.out.println("经过MD5消息摘要是:"+byte2hex(MD_1));
     
	 
	 //把对称密钥加到摘要md_1后形成新的字节数组MD_Key;
	 byte[] MD_Key=JOIN(MD_1,SingleKey);

	// System.out.println("合并摘要和加密密钥后的二进制信息为:"+byte2hex(MD_Key));
     
	 
    /* 将消息摘要MD_1[]和对称密钥SingleKey合并到字节数组MD_Key[]中,并用RSA算法中的私钥对该数组加密并保存在数组Rsa_sign[]中形成了数字签名*/
    /*  合并数组的算法略(主要就是通过循环将对称密钥添加到消息摘要数组的后面,形成一个新的数组MD_Key[],对称密钥要通过强制类型转化为byte类型)*/
     
     Cipher cipher1 = Cipher.getInstance("RSA/ECB/PKCS1Padding","SUN");
     System.out.println(cipher.getProvider().getInfo());
     cipher1.init(Cipher.ENCRYPT_MODE, priKey);
     byte[] Rsa_sign = cipher1.doFinal(MD_Key);
     System.out.println("公钥生成数字签名成功!");
  
   //System.out.println("RSA加密后的:"+byte2hex(Rsa_sign));
     
  
  /*将需要传输的原文的密文和数字签名写到文件En_info.dat中,En_info.dat即为在网上传输的信息*/
   ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("En_info.dat"));
   out.writeObject(Des_info);
   out.writeObject(Rsa_sign);
   out.close();
   System.out.println("原文件加密的密文和数字签名写到En_info.dat成功#!");
   }catch (Exception e) {
    e.printStackTrace();
    System.out.println(e.toString());
   
  }

  	
  }
  
  public byte[] JOIN(byte[] A,Key deskey)
 { System.out.println("开始合并!"); 
  byte[] B=deskey.toString().getBytes();
  System.out.println("密钥在字符数组B中"+byte2hex(B));
   int alen=A.length;
   
   int blen=B.length;
   int length=alen+blen;
   
   System.out.println("总长"+alen+blen+(alen+blen));
   byte[] C=new byte[length];
   int i;
   int j=0;
   for( i=0;i<length;i++)
   { 
     if(i<alen)
     { C[i]=A[i];
     // System.out.println(C[i]);
      }
    else
    { 
      if(j<blen)
      {
     	C[i]=B[j];
     	j++;
      //  System.out.println(C[i]);
      }
    }
    }
   System.out.println("合并消息摘要和对称密钥成功!");
  return C;
 }
 
 }

⌨️ 快捷键说明

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