安全加密解密 签名 证书

来源:互联网 发布:淘宝详情页最大尺寸 编辑:程序博客网 时间:2024/04/30 12:50
import java.io.ByteArrayOutputStream;
/** * 加解密步骤 * 0.准备要加解密的数据 并且把它封装成byte数组 * 1.得到个加解密对象 Cipher 创建对象时指定加解密算法、 * 2.得到个跟Cipher指定的相同加解密算法的Key对象 如果是用密码来加解密则要加盐 密码为8位数 * 3.初始化cipher对象是加密还是解密 并且把key关联进来 cipher.(模式,key); * 4.往加解密对象缓冲区中填充要加解密的2进制数据并开始加解密 update方法+doFinal方法 也可以直用doFinal方法 * 5.地4步会得到一个目的结果的byte数组 这就是你 想要的数据 并还原byte数组 */
package Security;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.security.Key;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import javax.crypto.Cipher;import javax.crypto.CipherInputStream;import javax.crypto.CipherOutputStream;import javax.crypto.KeyGenerator;import javax.crypto.Mac;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.PBEKeySpec;import javax.crypto.spec.PBEParameterSpec;public class SecretKeyTest {private static SecretKey secretKey;private static Cipher cipher;public static void main(String[] args) throws Exception {//secretEncryptByFile();//secretDecryptByFile();//secretEncryptByPWD();//secretDecryptByPWD();//publicKeyEncrypt();//privateKeyDecrypt();System.out.println(getMD5("sdfsad".getBytes()));sign();verify();}public static void secretDecryptByFile()throws Exception{ObjectInputStream ois=new ObjectInputStream(new FileInputStream("secret.key"));secretKey=(SecretKey)ois.readObject();cipher.init(cipher.DECRYPT_MODE, secretKey);byte[] results=readData("secret.dat");results=cipher.doFinal(results);results=cipher.doFinal(results);System.out.println(new String(results));/*//available 它是线程不安全的 JDK不提倡我们使用它 inputStream的实现类提供不同的方法 并且导致的//结果不一样 BufferedInputStream 的该方法好像是返回缓冲区的可读字节  // 如果我们在控制台读取数据时返回的永远是0因为数据还没准备好  在数据还没准备好或达到末尾为什么//返回0不返回-1了因为该方法的作用通常是在创建流的缓冲区是制定缓冲区长度而是-1的话会报异常所以//搞成0  //而且下面这句代码当流里的数据量非常大时是会出现堆内存溢出滴。。。。byte[] results=new byte[fis.available()];//下面的代码如果results的长度为0 那么返回的值也就是0  当制定了len时len为0也是返回0//如果你把它放在循环中条条件为(len=fis.read(results))!=-1 那时会出现死循环的//为返回结果制定一个len是确保程序的健壮性 因为有可能发生实际读出来的长度可能小于fis.available()int len=fis.read(results); results=cipher.doFinal(results,0,len);*//*//注意看类名是ByteArrayOutputStream 而不是ByteOuputStream  ByteArrayOutputStream baos=new ByteArrayOutputStream();for(int len;(len=fis.read())!=-1;){baos.write(len);}byte[] results=cipher.doFinal(baos.toByteArray());*///byte[] results=new byte[fis.available()];//int total=0;/*for(int len;(len=fis.read(results))!=-1;){total+=len;}*//*//下面可能会出现死循环 当length-total=0时  reaad方法返回的将为0 而0!=-1条件成立就这 样将成为死循环        //而!=0是在这里是不会出现死循环 但是当读到流的末尾时而length-total!=0那将返回-1 也会死循环for(int len;(len=fis.read(results,total,results.length-total))!=-1){total+=len;}*///这代码作用在于提前制定一个读取的量 并且肯定这个量在流中是存在的或在不久的将来会存在如网络上//对方发送过来的数据  不会超出流的范围而死循环 这时当出现未知错误而没读到数据时 它将会循环的不断//读取 只到流中又有了数据 并且读到了你指定的长度就结束 如果一老不来数据 将死循环/*for(int len;total<results.length;){len=fis.read(results,total,results.length-total);total+=len;}results=cipher.doFinal(results);*//*byte[] results=new byte[1024];int len=fis.read(results);results=cipher.doFinal(results,0,len);*/ois.close();}public static void secretEncryptByFile() throws Exception{cipher=Cipher.getInstance("AES");secretKey=KeyGenerator.getInstance("AES").generateKey();ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("secret.key"));oos.writeObject(secretKey);oos.close();cipher.init(Cipher.ENCRYPT_MODE, secretKey);cipher.update("加密类".getBytes());cipher.update("asdfadf".getBytes());byte[] results=cipher.doFinal();//也可以用带参数的一次到位不用update了results=cipher.doFinal(results);FileOutputStream fos=new FileOutputStream("secret.dat");fos.write(results);fos.close();System.out.println(new String(results));}public static void secretEncryptByPWD() throws Exception{cipher=Cipher.getInstance("PBEWithMD5ANDDES");secretKey=SecretKeyFactory.getInstance("PBEWithMD5ANDDES").generateSecret(new PBEKeySpec("12345678".toCharArray()));PBEParameterSpec pbms=new PBEParameterSpec(new byte[]{3,6,3,4,5,5,4,2}, 1000);cipher.init(Cipher.ENCRYPT_MODE, secretKey,pbms);byte[] results=cipher.doFinal("我好的很哦".getBytes());results=cipher.doFinal(results);System.out.println(new String(results));FileOutputStream fos=new FileOutputStream("secretByPWD.dat");fos.write(results);fos.close();}public static void secretDecryptByPWD() throws Exception{String fileName="secretByPWD.dat";byte[] results=readData(fileName);cipher=Cipher.getInstance("PBEWithMD5ANDDES");secretKey=SecretKeyFactory.getInstance("PBEWithMD5ANDDES").generateSecret(new PBEKeySpec("12345678".toCharArray()));PBEParameterSpec pbms=new PBEParameterSpec(new byte[]{3,6,3,4,5,5,4,2}, 1000);cipher.init(Cipher.DECRYPT_MODE, secretKey,pbms);results=cipher.doFinal(results);results=cipher.doFinal(results);System.out.println(new String(results));saveData(results, fileName);}private static byte[] readData(String fileName) throws FileNotFoundException,IOException {FileInputStream fis=new FileInputStream(fileName);byte[] results=new byte[fis.available()];fis.read(results);fis.close();return results;}private static void saveData(byte[] results, String fileName)throws FileNotFoundException, IOException {FileOutputStream fos=new FileOutputStream(fileName);fos.write(results);fos.close();}public static void publicKeyEncrypt() throws Exception{cipher=Cipher.getInstance("RSA");KeyPair keyPair=KeyPairGenerator.getInstance("RSA").generateKeyPair();PublicKey publicKey=keyPair.getPublic();PrivateKey privateKey=keyPair.getPrivate();String fileName="myPrivate.key";saveKey(privateKey, fileName);cipher.init(cipher.ENCRYPT_MODE, publicKey);byte[] results=cipher.doFinal("我要学编程".getBytes());System.out.println(new String(results));saveData(results,"public.data");}private static void saveKey(Key key, String fileName)throws IOException, FileNotFoundException {ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(fileName));oos.writeObject(key);oos.close();}public static void privateKeyDecrypt() throws Exception{String fileName="myPrivate.key";Key privateKey = readKey(fileName);cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] src=readData("public.data");//results=cipher.doFinal(results);//System.out.println(new String (results));FileInputStream fis=new FileInputStream("public.data");CipherInputStream cis=new CipherInputStream(fis,cipher);byte[] results=new byte[1024];System.out.println();//System.out.println("流读取"+fis.read());for(int len;(len=cis.read(results))!=-1;){System.out.print(new String(results,0,len));}cis.close();CipherOutputStream cos=new CipherOutputStream(new FileOutputStream("public.data"),cipher);cos.write(src);cos.write(src);cos.write(src);cos.flush();cos.close();fis.close();}private static Key readKey(String fileName) throws IOException, FileNotFoundException,ClassNotFoundException {ObjectInputStream ois=new ObjectInputStream(new FileInputStream(fileName));Key key=(Key)ois.readObject();ois.close();return key;}public static String getMD5(byte[] src) throws Exception{String result;MessageDigest messageDigest=MessageDigest.getInstance("MD5");messageDigest.update(src);byte[] results=messageDigest.digest();result=toHex(results);return result;}private static String toHex(byte[] results) {StringBuilder sBuilder=new StringBuilder();for(byte result:results){for(int count=0;count<2;count++){int temp=result&0xf;//System.out.println(temp);sBuilder.insert(0,(char)(temp<10?temp+'0':temp-10+'a'));result>>>=4;}}return sBuilder.toString();}public static void sign() throws Exception{KeyPair keyPair=KeyPairGenerator.getInstance("RSA").generateKeyPair();PrivateKey privateKey=keyPair.getPrivate();PublicKey publicKey=keyPair.getPublic();saveKey(publicKey,"sign_public.key");saveKey(privateKey,"sign_private_key");Signature sign=Signature.getInstance("MD5WithRSA");sign.initSign(privateKey);byte[] results="我签的名哦,不骗你".getBytes();sign.update(results);results=sign.sign();saveData(results, "sign.dat");System.out.println(new String(results));}public static void verify() throws Exception{PublicKey publicKey=(PublicKey)readKey("sign_public.key");Signature sign=Signature.getInstance("MD5WithRSA");byte[] results=readData("sign.dat");sign.initVerify(publicKey);sign.update("我签的名哦,不骗你".getBytes());boolean result=sign.verify(results);System.out.print(result);}}

package Security;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import javax.net.ssl.SSLSocketFactory;public class MySSHClientSocket {public static void main(String[] args) throws Exception {connectSever();}private static void connectSever() throws Exception {//System.setProperty("javax.net.ssl.trustStore", "c:/mykey.cer");//System.setProperty("javax.net.ssl.trustStoreType", "");System.out.println(System.getProperty("javax.net.ssl.trustStore"));Socket socket=SSLSocketFactory.getDefault().createSocket("127.0.0.1",9999);InputStream in=socket.getInputStream();OutputStream out=socket.getOutputStream();out.write("你好啊,服务器".getBytes());byte[] results=new byte[1024];int len=in.read(results);System.out.println(new String(results,0,len));}}