转载

用加密算法给女朋友写封情书

1.常用加密算法

       有对称密码,公钥密码,单向散列函数,数字签名, 伪随机数生成器。

       明文:是指没有加密的文字(或者字符串),加密之前的文字。

       密文:加了密的的文字。

        MDS算法 :单向散列函数                                                             SHA算法: 单向散列函数,秒传。

base64编码与解码:64个符号进行编码,多媒体信息追加到文本中。

    64个符号:a到z,A到Z,0到9,- +或者/


对称密码

(最古老的)凯撒密码:通过偏移来实现,比如偏移n位数 n=1 (hello就是ifmmp)。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * 工具类
 * @author Admin
 *
 */
public class Util {

	/**
	 * 凯撒密码加密
	 * @param msg 明文
	 * @return 密文
	 */
	public static String toCaesar(String msg) {
//		字符串转换成字符数组
		char[] data =msg.toCharArray();
		
//		Arrays
		System.out.println(Arrays.toString(data));
		
//		偏移(加密):把明文转换为密文
//		每个字符偏移特定的位置:如love
//		l,o,v,e
		for (int i = 0; i < data.length; i++) {
//			对每个字符进行处理,偏移 1
//			char c = data[i];
//		不是z的情况,才进行处理,标点符号除外
			if((data[i]  >='a' && data[i] <'z')
		|| (data[i] >='A' && data[i] <'Z')
					) {
			data[i]++;
			}
//			z?如何偏移
			if(data[i]=='z') {
				data[i]='a';
			}
			if(data[i]=='Z') {
				data[i]='A';
			}
			
//			todo,如果偏移是其他的值
			
			
		}
//		返回密文
		return  new String(data);
	}
}

 


package com.newer.demo;

public class App {

	public static void main(String[] args) {
		
//		a后面是b,中后面?
//		中文 在UTF-8是 多个字节
//		String msg=" i love u - zoom ? ZOOM";
//		
//		String msgCaesar= Util.toCaesar(msg);
//		
//		System.out.println(msgCaesar);
    }
}

控制台输出结果为:

[ , i,  , l, o, v, e,  , u,  , -,  , z, o, o, m,  , ?,  , Z, O, O, M]
 j mpwf v - appn ? APPN

公钥密码(非对称 RSA):加密与解密使用两个不同的密钥。
        https:使用混合加密方式。


单向散列函数:不能解密。
        确保数据的完整性,存储用户口令。
        散列函数把输入的内容(长度不限),生成固定长度的内容,消息摘要,指纹。
        md5
        sha128
        sha256
        sha512
        比特币是散列算法。区块的摘要信息

package com.newer.demo;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * 工具类
 * @author Admin
 *
 */
public class Util {




	/**
	 * 单向散列函数,生成摘要信息(数字指纹),过程不可逆(无法解密
	 * @param text 目标数据:字符串,字节数组,文件
	 * @return
	 */
	public static String toMD5(String text){
//		消息摘要
	try {
		byte[] data=	MessageDigest.getInstance("MD5").digest(text.getBytes());
//		字节数组转换成16进制数
		return new BigInteger(1,data).toString(16);
		
	} catch (NoSuchAlgorithmException e) {
		
		e.printStackTrace();
	}
		return null;
	}
	
/**
 * 
 * @param text
 * @return
 */
	public static String toSha256(String text){
//		消息摘要
	try {
		byte[] data=	MessageDigest.getInstance("SHA").digest(text.getBytes());
//		字节数组转换成16进制数
		return new BigInteger(1,data).toString(16);
		
	} catch (NoSuchAlgorithmException e) {
		
		e.printStackTrace();
	}
		return null;
	}
	
}

package com.newer.demo;

public class App {

	public static void main(String[] args) {
		
//		MD5---->32
		System.out.println(Util.toMD5(""));
		System.out.println(Util.toMD5("love"));
		System.out.println(Util.toMD5("i love you"));
    	System.out.println(Util.toMD5("这是一段文本内容...很长,很长...."));
		
//	        SHA256--->64
		System.out.println(Util.toSha256(""));
		System.out.println(Util.toSha256("love"));
		System.out.println(Util.toSha256(" I love you"));
		System.out.println(Util.toSha256("这是一段文本内容...很长,很长...."));
	}
}

控制台输出结果为:

d41d8cd98f00b204e9800998ecf8427e
b5c0b187fe309af0f4d35982fd961d7e
459b9511a7f650ebd327889c45cc4e9b
6801cad5e0c2a026f3d562c2b4ea13cd
da39a3ee5e6b4b0d3255bfef95601890afd80709
9f2feb0f1ef425b292f2f94bc8482494df430413
f6de392817cbb574fa480f63fefc0b85f2f63c93
6c8ba80d95708c301b6228b2258eebc895bb9810

 

正文到此结束
本文目录