Java安全(JCA/JSSE):对称加密

对称加密也称为密钥加密,速度快,但加密和解密的钥匙必须相同,只有通信双方才能知道钥匙。

基本步骤: 得到keyGenerator的实例对象,并调用其generateKey()方法创建SecretKey对象。 得到Cipher的实例对象,并调用其init()方法指定SecretKey对象和指定要进行加密、还是进行解密操作。 调用Cipher对象的doFinal()方法完成加密或解密操作。

扩展步骤: 把密钥保存为密钥文件并传递给对方,用密钥文件对其他文件加密后,再把加密的结果文件传递给对方,让对方用密钥文件解密。 单独使用CipherInputStream或CipherOutputStream都可以完成加密和解密操作,关键在于传入的Cipher对象的操作模式。 由于加密时所涉及的secretkey不好记忆和交换,可以使用SecretKeyFactory 将口令生成SecretKey。

 

得到一个类的实例,一般有这些方法:

New

本类. getInstance()   Cipher. getInstance(“AES”)

其他类的某个方法产生    Connectionct=DriverManager.getConnection()

工厂类的产生方法

ServerSocket ss= ServerSocketFactory.getDefault().createServerSocket()

 

 

关于密钥加密加密和流的一些小算法

//key写入文件给别//

package com.xiongshiyan.security;

 

import java.io.ByteArrayOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import java.security.Key;

import java.security.NoSuchAlgorithmException;

 

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.SecretKeyFactory;

 

publicclass SecretKeyTest {

 

    /**

     * @param args

     * @throwsNoSuchPaddingException

     * @throwsNoSuchAlgorithmException

     */

    publicstaticvoid main(String[] args) throws Exception {

       // TODO Auto-generatedmethod stub

       SecretKeyTest.secretAES();

       //SecretKeyTest.deSecretAES();

    }

   

    privatestaticvoid secretAES() throws Exception{

       //创建加密对象

       Cipher cipher = Cipher.getInstance("AES");

       //Keykey=SecretKeyFactory.getInstance("AES").generateSecret(null);

       Key key=KeyGenerator.getInstance("AES").generateKey();

       cipher.init(Cipher.ENCRYPT_MODE, key);

       byte[] secResult=cipher.doFinal("abcdefg数据".getBytes());

       System.out.println(new String(secResult));

      

       //把加密后的数据和key一起给别人  别人拿到了之后进行恢复

       ObjectOutputStream oosKey=new ObjectOutputStream(new FileOutputStream("key.key"));

       oosKey.writeObject(key);//写入加密key

       oosKey.close();

      

       FileOutputStream oosDat=new FileOutputStream("dat.dat");

       oosDat.write(secResult);//写入加密dat

       oosDat.close();

    }

   

    privatestaticvoid deSecretAES() throws Exception{

       //创建加密对象

       Cipher cipher = Cipher.getInstance("AES");

/**

        * 实现Serializable接口,保存数据的时候你就能按照sun定义的标准格式进行,ObjectInputStreamObjectOutputStream提供的readObjectwriteObject进行读写,你也可以自己扩展格式,实现Externalizable接口

        */

       ObjectInputStream oisKey=new ObjectInputStream(new FileInputStream("key.key"));

        Keykey=(Key)oisKey.readObject();

       oisKey.close();

       cipher.init(Cipher.DECRYPT_MODE, key);

      

       FileInputStream fisDat=new FileInputStream("dat.dat");

    /*  ByteArrayOutputStreambaos=new ByteArrayOutputStream();

       SecretKeyTest.copyStream(fisDat, baos);

       byte[] deSecResult=cipher.doFinal(baos.toByteArray());*/

      

       byte[] src=newbyte[fisDat.available()];//对于文件流来说就是其长度,而对于像网络流就不是了

       int len=fisDat.read(src);

       int total=0;

       while(total<src.length){

           total+=len;

           len=fisDat.read(src, total, src.length-total);

       }

       byte[] deSecResult=cipher.doFinal(src);

      

       fisDat.close();

       System.out.println(new String(deSecResult));

    }

   

    privatestaticvoid copyStream(InputStream is,OutputStream os) throws Exception{

       byte[] buff=newbyte[1024];

       int total=0;

       int len=is.read(buff);

       while(len!=-1){

           os.write(buff, 0, len);

           len=is.read(buff);

       }

    }

 

}

 

 

 

//脑袋里面记住一个密码就好了

privatestaticvoid secretPBE() throws Exception{//脑袋里面记住你的密码

       //创建加密对象

       Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");

       Key key=SecretKeyFactory.getInstance("PBEWithMD5AndDES")

           .generateSecret(new PBEKeySpec("xiongshiyan".toCharArray()));//xiongshiyan就是你的密码

       //Keykey=KeyGenerator.getInstance("AES").generateKey();

      

       PBEParameterSpec pbeParameterSpec=new PBEParameterSpec(newbyte[]{1,2,3,4,5,6,7,8},1000);

       cipher.init(Cipher.ENCRYPT_MODE,key,pbeParameterSpec);

      

       byte[] secResult=cipher.doFinal("数据abcdefg".getBytes());

       System.out.println(new String(secResult));

      

       FileOutputStream oosDat=new FileOutputStream("dat.dat");

       oosDat.write(secResult);//写入加密dat

       oosDat.close();

    }

    privatestaticvoid deSecretPBE() throws Exception{

       Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");

       Key key=SecretKeyFactory.getInstance("PBEWithMD5AndDES")

           .generateSecret(new PBEKeySpec("xiongshiyan".toCharArray()));

       //Keykey=KeyGenerator.getInstance("AES").generateKey();

      

       PBEParameterSpec pbeParameterSpec=new PBEParameterSpec(newbyte[]{1,2,3,4,5,6,7,8},1000);

       cipher.init(Cipher.DECRYPT_MODE,key,pbeParameterSpec);

      

       FileInputStream fisDat=new FileInputStream("dat.dat");

    /*  ByteArrayOutputStreambaos=new ByteArrayOutputStream();

       SecretKeyTest.copyStream(fisDat, baos);

       byte[] deSecResult=cipher.doFinal(baos.toByteArray());*/

      

       byte[] src=newbyte[fisDat.available()];//对于文件流来说就是其长度,而对于像网络流就不是了

       int len=fisDat.read(src);

       int total=0;

       while(total<src.length){

           total+=len;

           len=fisDat.read(src, total, src.length-total);

       }

       byte[] deSecResult=cipher.doFinal(src);

      

       fisDat.close();

       System.out.println(new String(deSecResult));

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值