`

获取摘要、加密、解密

 
阅读更多
生成SHA或MD5摘要
	MessageDigest sha = MessageDigest.getInstance("SHA");//字符串参数可以为:"SHA"或"MD5"
		sha.update("luoxun".getBytes());
		byte[] digest = sha.digest();
		StringBuilder sb = new StringBuilder();
		for(int i= 0;i<digest.length;i++){
			int v = digest[i]&0XFF;
			if(v<16) sb.append("0");
			sb.append(Integer.toString(v,16)).append(" ");
		}
		print(sb.toString().toUpperCase());

AES加密解密文件demo
	
//生成密钥
private static SecretKey generatorKey() throws NoSuchAlgorithmException {
		KeyGenerator generator = KeyGenerator.getInstance("AES");
		SecureRandom rand = new SecureRandom();
		generator.init(rand);
		SecretKey secretKey = generator.generateKey();
		return secretKey;
	}
	private static void cipherFile(SecretKey secretKey,int mode,String inFile,String outFile)throws Exception{
		Cipher cipher = Cipher.getInstance("AES");
		cipher.init(mode, secretKey);
		
		int blockSize = cipher.getBlockSize();
		byte[] inbuff  = new byte[blockSize];
		
		String source = ClassLoader.getSystemResource(inFile).getFile();
		String chiper = ClassLoader.getSystemResource(outFile).getFile();
		FileInputStream in   = new FileInputStream(source);
		FileOutputStream out = new FileOutputStream(chiper);
		
		while(true){
			int inlen = in.read(inbuff);
			System.out.println(inlen);
			if(inlen == blockSize){
				out.write(cipher.update(inbuff));
			}else if(inlen > 0){
				out.write(cipher.doFinal(inbuff,0,inlen));//如果在读取中出现字节数小于bolckSize 这样它会生成如下填充:inlen=1 xx 01;inlen=2 xx 02 02;inlen=3 xx 03 03 03
				break;
			}else{
				out.write(cipher.doFinal());//如果读取的所有字节数刚好被blockSize整除执行cipher.doFinal()产生如下填充:blockSize个[0blocakSize]
				break;
			}
		}
		out.flush();
		out.close();
		in.close();
	}

AES是一种对称密码,所以加密和解密的时候要用要同一个密钥。
		SecretKey secretKey = generatorKey();
//Cipher.ENCRYPT_MODE加密
		cipherFile(secretKey,Cipher.ENCRYPT_MODE,"source.text","cipher.text");
//Cipher.DECRYPT_MODE解密
cipherFile(secretKey,Cipher.DECRYPT_MODE,"cipher.text","sourcecopy.text");

密码流:CipherInputStream和CipherOutputStream他们提供了可以传入Cipher对象的构造函数,可方便的对流中的信息加密解密
		//下面为解决AES密钥的发布 解决方案,AES密钥为对称密钥,每次产生的密钥都需要在双方之间发送这显然是不安全的
		KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
		int keysize = 512;
		SecureRandom rand = new SecureRandom();
		generator.initialize(keysize, rand);
		KeyPair keyPair = generator.generateKeyPair();
		PrivateKey privateKey = keyPair.getPrivate();
		PublicKey  publicKey  = keyPair.getPublic();
		
		Key key = null;//这是一个AES的密钥
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.WRAP_MODE, publicKey);//用RSA公钥加密AES密钥
		byte[] wrappedKey = cipher.wrap(key);
		
		cipher.init(Cipher.UNWRAP_MODE, privateKey);//用RSA私钥解密AES密钥
		cipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);


一下是对加密解密的简单封装,可以当作工具类使用:
package Crypto;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
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.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;

public class Crypto {
	private static final String AES = "AES";
	private static final String RSA = "RSA";
	
	public static Key genAndSaveKey( String filename )throws Exception{
		Key key = Crypto.genKey();
		Crypto.saveKey(filename, key);
		return key;
	}
	
	public static Key genKey() throws NoSuchAlgorithmException{
		KeyGenerator keygen = KeyGenerator.getInstance(AES);
		SecureRandom random = new SecureRandom();
		keygen.init(random);
		return keygen.generateKey();
	}
	
	public static boolean saveKey( String filename , Key key )throws IOException{
		File file = new File(filename);
		if( file.exists() ){
			ObjectOutputStream out = null;
			try{
				out = new ObjectOutputStream(new FileOutputStream(file));
				out.writeObject(key);
				out.flush();
				return true;
			}finally{
				if( out != null ) out.close();
			}
		}
		return false;
	}
	
	public static Key readKey( String filename )throws IOException, ClassNotFoundException{
		File file = new File(filename);
		if( file.exists() ){
			ObjectInputStream out = null;
			try{
				out = new ObjectInputStream(new FileInputStream(file));
				return (Key) out.readObject();
			}finally{
				if( out != null ) out.close();
			}
		}
		return null;
	}
	
	public static byte[] encrypt( byte[] buf , Key key ) throws Exception{
		return crypt(buf, key, Cipher.ENCRYPT_MODE);
	}
	
	public static byte[] decrypt( byte[] buf , Key key ) throws Exception{
		return crypt(buf, key, Cipher.DECRYPT_MODE);
	}
	
	public static byte[] crypt0( byte[] buf , Key key , int mode) throws Exception{
		Cipher cipher = Cipher.getInstance(AES);
		cipher.init(mode, key);
		int blockSize = cipher.getBlockSize();
		int outSize   = cipher.getOutputSize(blockSize);
		
		byte[] inbytes  = new byte[blockSize];
		byte[] outbytes = new byte[outSize];
		
		ByteArrayInputStream  inStream 	= new ByteArrayInputStream(buf);
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		
		int inLength = 0;
		while( (inLength = inStream.read(inbytes)) == inbytes.length ){
			int outLength = cipher.update( inbytes , 0 , inbytes.length , outbytes );
			outStream.write( outbytes , 0 , outLength );
		}
		
		if( inLength > 0 ){
			outbytes = cipher.doFinal(inbytes, 0, inLength);
		}else{
			outbytes = cipher.doFinal();
		}
		outStream.write(outbytes);
		
		return outStream.toByteArray();
	}
	
	public static byte[] crypt( byte[] buf , Key key , int mode) throws Exception{
		Cipher cipher = Cipher.getInstance(AES);
		cipher.init(mode, key);
		CipherOutputStream 	  cipoStream = null;
		ByteArrayOutputStream buffStream = new ByteArrayOutputStream();
		try {
			cipoStream = new CipherOutputStream(buffStream, cipher);
			cipoStream.write(buf);
		}finally{
			if( cipoStream != null ) cipoStream.close();
		}
		return buffStream.toByteArray();
	}
	
	public static KeyPair genKeyPair() throws NoSuchAlgorithmException{
		KeyPairGenerator genkey = KeyPairGenerator.getInstance(RSA);
		SecureRandom random = new SecureRandom();
		genkey.initialize(512, random);
		return genkey.generateKeyPair();
	}
	
	public static byte[] encryptKey(Key key , PublicKey publicKey) throws Exception{
		Cipher cipher = Cipher.getInstance(RSA);
		cipher.init(Cipher.WRAP_MODE, publicKey);
		return cipher.wrap(key);
	}
	
	public static Key decryptKey(byte[] wrappedKey, PrivateKey privateKey) throws Exception{
		Cipher cipher = Cipher.getInstance(RSA);
		cipher.init(Cipher.UNWRAP_MODE, privateKey);
		return cipher.unwrap(wrappedKey, AES, Cipher.SECRET_KEY);
	}
	
	public static void main(String[] args) throws Exception {
		String filename = ClassLoader.getSystemClassLoader().getResource("resource/key").getFile();
		Key key = Crypto.readKey(filename);
		
		KeyPair keyPair = genKeyPair();
		PublicKey publicKey = keyPair.getPublic();
		PrivateKey privateKey = keyPair.getPrivate();
		
		byte[] wrappedKey = encryptKey(key, publicKey);
		key = decryptKey(wrappedKey, privateKey);
		
		byte[] bytes = encrypt("luoxun".getBytes(), key);
		System.out.println(Arrays.toString(bytes));
		byte[] decode = decrypt(bytes, key);
		System.out.println(new String(decode));
		
	}
	
}
分享到:
评论

相关推荐

    C# 10种加密解密方式

    以下是对标题和描述中提及的10种C#加密解密方式的详细解释: 1. **MD5加密**:MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它将任意长度的数据转化为固定长度的摘要。虽然MD5已经不被认为安全用于...

    基于MATLAB的光学图像加密解密技术.pdf

    基于MATLAB的光学图像加密解密技术 摘要:本文设计并实现基于混沌理论、像素级别打乱和隐写术的图像加密算法,以保护图像信息在通信的传输过程中不被未授权的人员轻易获取。该算法利用MATLAB软件对图像像素打乱后,...

    加密解密技术内幕(chm格式)

    在信息化社会,数据安全日益重要,加密解密技术成为确保信息不被非法获取和利用的关键手段。本书《加密解密_技术内幕》深入浅出地介绍了这一领域的核心概念和实践方法。 首先,加密技术的基本原理是将明文(可读...

    加密解密工具(含程序源码)

    加密和解密是信息安全领域中的核心概念,它们用于保护数据的隐私性和完整性。在这个主题中,我们主要关注一个...通过阅读和分析源码,开发者可以深入理解加密解密过程,并可能从中获取灵感,用于自定义的安全解决方案。

    C#加密解密,包括DES、MD5、SHA256

    根据给定文件的信息,我们可以总结出关于C#中几种常用加密...通过以上代码示例,我们了解了如何在C#中实现DES加密解密、MD5和SHA256散列函数。这些技术在实际开发中非常有用,尤其是在保护用户数据的安全性和隐私方面。

    公钥加密私钥解密&私钥加密公钥解密

    ### 公钥加密私钥解密与私钥加密公钥解密 在现代信息安全领域,公钥加密私钥解密及私钥加密后由公钥解密或验证的技术被广泛应用于数据保护、身份验证和安全通信等多个方面。下面将详细阐述这两种技术的基本原理及其...

    字符串的加密解密

    在给定的“字符串的加密解密”项目中,我们可以推断这是一个使用Visual Studio 2012开发的通用加密解密库,适用于多种编程场景。下面将详细探讨字符串加密解密的基本原理、常见算法以及如何在实际应用中使用。 1. *...

    公钥私钥加密解密数字证书数字签名详解.docx

    ### 公钥私钥加密解密、数字证书与数字签名详解 #### 一、基础知识概述 在探讨公钥私钥加密解密、数字证书以及数字签名之前,我们需要先理解几个核心概念。 **1. 密钥对:** - 在非对称加密技术中,存在两种密钥...

    MD5 AES 加密解密

    使用这样的工具,开发者可以快速地为他们的BIN文件生成MD5摘要,并使用AES进行加密和解密操作,从而提高系统整体的安全性。 总的来说,MD5和AES是保证数据完整性和保密性的核心技术,它们在嵌入式系统中的应用对于...

    android用MD5加密解密demo

    3. 获取MD5摘要,即加密后的结果。 ```java byte[] digest = md.digest(); ``` 4. 将字节数组转换为16进制字符串,便于查看和比较。 ```java StringBuilder sb = new StringBuilder(); for (byte b : digest) { sb....

    加密解密小工具(C#,VB示例)

    在标题“加密解密小工具(C#,VB示例)”中,我们可以推测这是一个包含C#和VB编程语言实现的加密解密工具,旨在帮助开发者解决配置文件中的敏感信息加密,比如数据库连接字符串等关键数据的保护问题。 描述中提到的...

    Android 各种加密解密

    在Android平台上,加密和解密是安全编程的重要组成部分,用于保护数据隐私和信息安全。本文将深入探讨四种常见的...在JiaMi这个项目中,可能包含了具体的示例代码或教程,帮助开发者更好地理解和应用这些加密解密技术。

    RSA加密解密类库及代码示例

    这个压缩包"RSA加密解密类库及代码示例"中可能包含了以下内容: 1. RSA加密库:这可能是一个预编译好的库,例如开源的OpenSSL或Bouncy Castle,这些库提供了RSA加密的API,开发者可以直接调用进行加密和解密操作。 ...

    java的加密解密封装

    对于这些加密解密方法的封装,开发者通常会创建一个单独的工具类或库,包含静态方法,这些方法接受明文或密文,以及必要的密钥或参数,然后返回加密或解密后的结果。封装的好处是简化了代码的使用,提高了代码的...

    java加密解密算法大全

    ### Java加密解密算法详解 #### 一、加密概述与应用 加密技术是信息安全领域中的关键技术之一,其核心在于通过特定算法对原始信息(明文)进行变换,使其成为不可直接阅读的形式(密文),从而保护信息在传输或...

    Java加密解密方法大全

    ### Java加密解密方法大全:深入解析 #### 加密概述及其重要性 在当今数字化时代,信息安全成为企业和个人关注的焦点。加密技术作为保障数据安全的关键手段,其重要性不言而喻。加密,实质上是一种通过特殊算法...

    MD5加密解密

    根据给定的文件信息,我们可以总结出以下关于“MD5加密解密”的相关知识点: ## MD5加密解密概述 MD5(Message-Digest Algorithm 5)是一种广泛使用的散列算法,它可以将任意长度的数据转换成一个固定长度(通常为...

    字符串加密解密工具

    在IT领域,字符串加密解密是信息安全的重要组成部分,主要用于保护数据的隐私性和完整性。字符串加密是一种将可读的明文字符串转化为不可读的密文,防止未经授权的访问者获取信息。解密则是加密的逆过程,将密文恢复...

    MFC实现利用MD5和AES加解密,利用26个字母和0-9数字实现每次加密后密文不同,解密后明文正确

    在本文中,我们将深入探讨如何使用...通过MD5生成独特密钥和AES的高效加密解密能力,我们可以确保数据在传输和存储时的安全性。这样的实现为开发人员提供了强大的工具,帮助他们在MFC应用中实现高效而可靠的数据保护。

Global site tag (gtag.js) - Google Analytics