Java为我们实现了MD5、RSA两种常用的加密算法,这在我们的开发中也大量使用。

        一般是第三方采用公钥加密,服务器采用私钥解密。私钥一般不做加密处理。但是为了数据间的相互通信,服务器怎么发送数据呢,一般采用的是两对公私钥匙。服务器发送数据,也采用第三方的公钥,第三方接收数据后用自己的私钥解密。

        总结一句话,服务器保存自己的私钥,第三方的公钥。第三方亦然。

         签名:一般采用服务器私钥加密,生成签名,然后客户端公钥解密,验证签名。

数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

    签名的好处:保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。

    总结:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,

既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。

  

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要壹对密钥,使用其中壹個加密,则需要用另壹個才能解密。
RSA的算法涉及三个参数,ne1e2
其中,n 是两个大质数 p的积,参数 n 用二进制表示时所占用的位数,就是所谓的密钥长度,目前市场上常用的密钥长度多是1024位。
e1 和 e2 是壹对相关的值,e1 可以取任意值,但要求 e1 与 (p-1)*(q-1) 互质;在上述前提下,选择 e2 则要求 (e2*e1) mod ((p-1)*(q-1)) = 1
此时 (n,e1) 和 (n,e2) 就是密钥对。其中 (n,e1) 为公钥,(n,e2) 为私钥。
RSA 加密和解密的算法是完全相同的,设 A 为明文,为密文,则:A = B^e2 mod n;B = A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e1 和 e2 可以互换使用,即:A = B^e1 mod n;B = A^e2 mod n;

package com.lijianbo.util;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.security.Key;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.SecureRandom;import javax.crypto.Cipher;/** * RSA加密算法,加密解密过程 * 生成秘钥对            公钥、私钥 * @author bbo * */public class RSAUtil {		//指定加密算法为RSA	private static String ALGORITHM = "RSA";	//指定key的大小	private static int KEYSIZE = 1024;	//指定公钥存放文件和私钥存放文件	private static String PUBLIC_KEY_FILE = "src/public.key";	private static String PRIVATE_KEY_FILE = "src/private.key";		//生成公钥和私钥并分别存放在文件中	private static void generateKeyPair() throws Exception{	   //生成密钥对	   KeyPairGenerator kpg = KeyPairGenerator.getInstance(ALGORITHM);	   kpg.initialize(KEYSIZE, new SecureRandom());	   KeyPair kp = kpg.generateKeyPair();	   //通过密钥对分别得到公钥和私钥	   Key publicKey = kp.getPublic();	   Key privateKey = kp.getPrivate();	   //将生成的密钥写入文件	   ObjectOutputStream output1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));	   ObjectOutputStream output2 = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE));	   output1.writeObject(publicKey);	   output2.writeObject(privateKey);	   output1.close();	   output2.close();	}		//RSA  公钥加密方法	public static String encrypt(String source, String publicKeyFile) throws Exception {		//读出文件中的公钥对象		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(publicKeyFile));		Key key = (Key) ois.readObject();		ois.close();		//得到Cipher对象来实现对源数据的RSA加密		Cipher cipher = Cipher.getInstance(ALGORITHM);		cipher.init(Cipher.ENCRYPT_MODE, key);		byte[] b = source.getBytes();		String cryptograph = Base64Utils.encode(cipher.doFinal(b));		return cryptograph;	}		//RSA  私钥解密方法	public static String decrypt(String cryptograph, String privateKeyFile) throws Exception {	   //读出文件中的私钥对象	   ObjectInputStream input = new ObjectInputStream(new FileInputStream(privateKeyFile));	   Key key = (Key) input.readObject();	 //  System.out.println("私钥为:"+key.toString());	   input.close();	   //对已经加密的数据进行RSA解密	   Cipher cipher = Cipher.getInstance(ALGORITHM);	   cipher.init(Cipher.DECRYPT_MODE, key);	   byte[] b1 = Base64Utils.decode(cryptograph);	   //执行解密操作	   byte[] b = cipher.doFinal(b1);	   String source = new String(b);	   return source;	}	//调用方法举例	public static void main(String[] args) {		String source = "RSA加密解密过程--成都欢迎你";		System.out.println("明文字符串:[" + source + "]");		try{			//生成可用的密钥对并分别保存在文件中			generateKeyPair();			System.out.println("生成的公钥文件为:" + PUBLIC_KEY_FILE + ", 生成的私钥文件为:" + PRIVATE_KEY_FILE);			String cryptograph = encrypt(source, PUBLIC_KEY_FILE);//公钥生成的密文			System.out.println("加密之后的字符串为:[" + cryptograph + "]");			String text = decrypt(cryptograph, PRIVATE_KEY_FILE);//私钥解密密文			System.out.println("解密之后的字符串为:[" + text + "]");		}catch(Exception e){			System.out.println("加解密过程中发生错误:" + e.getMessage());			return;		}	}}

编码工具类:

package com.lijianbo.util;import org.apache.commons.codec.binary.Base64;/** * @author bbo * BASE64编码 */public class Base64Utils {	//编码	public static String encode(final byte[] Encp) {		if (ObjectUtils.isEmpty(Encp)) {			return null;		}		return Base64.encodeBase64String(Encp);//编码	}	//解码	public static byte[] decode(final String Decp) {		if (ObjectUtils.isEmpty(Decp)) {			return null;		}		return Base64.decodeBase64(Decp);//解码	}}

运行结果为:

明文字符串:[RSA加密解密过程--成都欢迎你]生成的公钥文件为:src/public.key, 生成的私钥文件为:src/private.key加密之后的字符串为:[bNckGX9OWwXmaDfoSKnw8sL2PwQJaYCflWipXpKs6RPhz7TIFCy9+yoBl1u94t7oeRWosx6hIXFUwXZBjkpx31Myq9rH+I5acSabWvowf2BKrpxs18X7vw26rkohI4E1ldoWfmWIM8iLC9WFek3FIx5V01GTHTQXjtSAsqFGa/M=]解密之后的字符串为:[RSA加密解密过程--成都欢迎你]