Java加密和数字签名 2私钥加密

最近初步接触了下Java加密和数字签名的相关内容,我学习的过程大概分五步:
1)消息摘要
2)私钥加密
3)公钥加密
4)数字签名
5) 数字证书
下面的代码是第二部分:私钥加密
希望能为刚刚接触这个的朋友们省点事

package security;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;

/**
 * 此例子是对一个字符串信息,用一个私钥(key)加密,然后在用该私钥解密,验证是否一致
 * 私钥加密,是对称加密
 * 使用对称算法。比如:A用一个密钥对一个文件加密,而B读取这个文件的话,则需要和A一样的密钥,双方共享一
 * 个私钥(而在web环境下,私钥在传递时容易被侦听)
 * 
 * 附:主要对称算法有:DES(实际密钥只用到56 位)
 * AES(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有DESede等
 */
public class PrivateKey {
    public static void main(String[] args) throws Exception {

        String before = "asdf";       
        byte[] plainText = before.getBytes("UTF8");
        
        //1步**********************************************************************
        System.out.println("Start generate AES key.");
        //得到一个使用AES算法的KeyGenerator的实例
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        //定义密钥长度128位
        keyGen.init(128);
        //通过KeyGenerator产生一个key(密钥算法刚才已定义,为AES)
        Key key = keyGen.generateKey();
        System.out.println("Finish generating AES key."+key);

        
        //2步**********************************************************************
        //获得一个私钥加密类Cipher,定义Cipher的基本信息:ECB是加密方式,PKCS5Padding是填充方法
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
//        System.out.println("\n" + cipher.getProvider().getInfo());

        
        //3步**********************************************************************
        //使用私钥加密
        System.out.println("\n用私钥加密...");
        //把刚才生成的key当作参数,初始化使用刚才获得的私钥加密类,Cipher.ENCRYPT_MODE意思是加密
        cipher.init(Cipher.ENCRYPT_MODE, key);
        
        //私钥加密类Cipher进行加密,加密后返回一个字节流byte[]
        byte[] cipherText = cipher.doFinal(plainText);
        
        //以UTF8格式把字节流转化为String
        String after1 = new String(cipherText, "UTF8");
        System.out.println("用私钥加密完成:"+after1);

        
        //4步**********************************************************************
        //使用私钥对刚才加密的信息进行解密,看看是否一致,Cipher.DECRYPT_MODE意思是解密钥
        System.out.println("\n用私钥解密...");
        cipher.init(Cipher.DECRYPT_MODE, key);
        
        //对刚才私钥加密的字节流进行解密,解密后返回一个字节流byte[]
        byte[] newPlainText = cipher.doFinal(cipherText);
        
        String after2 = new String(newPlainText, "UTF8");
        System.out.println("用私钥解密完成:"+after2);
    }
}

你可能感兴趣的:(java,Web,算法,Security)