网络安全--加密入门
1.加密起源,凯撒密码的原理和破解方式。
2.对称加密的原理和破解方式。
3.DEA和AES两种加密算法的加密原理和应用。
4.Base64编码在加密过程中的使用。
凯撒密码
古时候两军对垒为了防止敌方截获信息导致信息泄露,从而进行数据加密,就算敌军截获后无法解密就无法获取信息。
明文:就是原始信息。
密文:(经过加密算法混淆之后的信息)。
密匙:加密与解密算法的参数,直接影响对明文进行变换的结果。
加密算法:以密匙位参数,对明文进行多种置换和转换的规则和步骤,变换结果为密文。
解密算法:加密算法的逆转换,以密文为输入,密匙位参数,变换后的结果为明文。

public class CaesarDemo {
public static void main(String[] args) {
//1、明文:原始洗信息
String clearText = "我是傻狍子";
//加密规则:将字谜按照字母表的顺序向右移动3位
int key =3;
//2、密文:通过加密算法将明文混淆之后的信息
String cipher =encrypt(clearText,2);
System.out.print("加密后的内容:"+cipher);
//解密
String dncrypt = dncrypt(cipher,2);
System.out.print("解密后的内容:"+dncrypt);
}
/**
* 加密
* @param clearText 明文
* @param key 加密规则
* @return
*/
private static String encrypt(String clearText,int key) {
char[] charArray = clearText.toCharArray();
for (int i = 0; i < charArray.length; i++) {
//在ASCII码表 向右移动三位
//char c = (char) (charArray[i]+3);
//加密替换
//charArray[i]=c;
//将以上代码简化得:
charArray[i]+=3;
}
return new String(charArray);
}
/**
* 解密
* @param cipherText 密文
* @param key 解密规则
* @return
*/
private static String dncrypt(String cipherText, int key) {
char[] charArray = cipherText.toCharArray();
for (int i = 0; i < charArray.length; i++) {
charArray[i]-=3;
}
return new String(charArray);
}
}


频率分析法:可以通过一段程序,来检测一篇文章中每个字母出现的次数,将得到的频率和上图(英文中常用字母进行匹配)那么久有可能得知其加密算法。
解密流程:
1、统计密文里出现次数最多的字符,比如说出现次数最多的是 ‘h’。
2、计算字符‘h’到‘e’的偏移量,值为3,则表示原文偏移了3个位置。
3、将密文所有字符恢复偏移3个位置。
注意点:
1、统计密文里出现次数最多的字符时,需多统计几个备选,因为最多可能是空格或者是其他字符。
2、短文可能严重偏离标准频率,假如文章少于100个字母,那么对它的解密就会比较困难,而且不是所有的文章都使用表中频度。
对称加密

加密和解密都使用同一把秘钥,这种加密方法被称为对称加密,也称为单秘钥加密。
简单理解为:加密解密都是同一把钥匙。
凯撒密码就属于对称加密,他的字符偏移量即为秘钥。
基于“对称秘钥”的加密算法主要有DES算法,3DES算法,AES算法,Blowish算法,
RC5算法和IDEA算法等等,这里介绍DES算法和AES算法。
对称密码常用的数学运算:
移位和循环:
位移就是讲一段代码按照规定的位数整体性地左移或者右移,循环右移就是当右移时,把数码的最后的位移到数码的最前面,循环左移相反。
例如,对十进制数码12345678循环右移1位(十进制)的结果为81234567, 而循环左移1位的结果为23456781。
置换
就是将数码中的某一位的值更具置换表的规定,用另外一位代替,它不像移位操作那样整齐有序,看上去杂乱无章,这正是加密所需,被经常使用。
扩展
就是将一段代码扩展成比原来位数更长的数码。扩展方法有多种,例如,可以用置换的方法,以扩展置换表来规定扩展后的数码每一位的替代值。
压缩
就是将一段数码压缩成比原来更短的数码,压缩的方法有多种,例如,也可以用置换的方法,以表来规定压缩后的数码每一位的替代值。
异或
这是一种二进制布尔代数运算。异或的数学符号为:⊕ 来源:基本门电路中的符号。
1⊕1=0,
0⊕0=0,
1⊕ 0=1,
0⊕1=1.
简单来说就是 同则false异则true。
迭代
迭代就是多次重复相同的运算,这在密码算法中经常使用,以使得形成的密文更加难以破解。
总结:这些运算主要是对比特位进行操作,器共同目的就是把被加密的明文数码尽可能深的打乱,从而加大破译难度。
DES 算法(用596位密钥加密64位明文)
DES 是Data Encryption Standard(数据加密标准)的缩写,它是由IBM公司研制的一种对称密码算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准,四十年来它一直活跃在国际保密通信的舞台上,扮演了十分重要的角色。
DES 是一个分组加密算法,典型的DES以64位位分组对称加密,加密和解密用的是同一个算法。它的秘钥长度是56位(因为每个第8位都用作基偶校验),密钥可以是任意的56位的数,其保密性依赖于密钥。
DES 加密的算法框架大致如下:
首先要生成一套加密密钥,从用户处取得一个64位长的 密码口令,然后通过等分,位移,选取,和迭代形成一套16个
加密密钥,分别供每一轮运算中使用。
DES 对64位(bit)的明文分组M 进行操作,M经过一个初始置换IP,置换成M0,将M0明文分成左半部分和右半部分,各32位长。
然后进行16轮完全相同的运算(迭代),在每一轮运算过程中数据与相应的秘钥结合。
经过16轮迭代之后,左、右半部分何在一起经过一个末置换(数据整理),这样就完成了加密过程

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class DesDemo {
public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
/**
* 1 明文 2 提供原始密钥:长度64位,8个字节
*
*/
String clearText = "我是傻子";
String origninKey = "12345678";
String cipherText = desEncript(clearText, origninKey);
System.out.println(cipherText);
}
/**
* 用DES 算法进行加密(就是通过对比特位进行一些数学运算)
*
* @param clearText
* @param origninKey
* @return
* @throws NoSuchPaddingException: 填充异常(工具模式和填充模式)
* @throws NoSuchAlgorithmException:没有此算法异常
* @throws InvalidKeyException 无效的密钥异常
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
private static String desEncript(String clearText, String origninKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
//1、 获取算法工具类
Cipher cipher = Cipher.getInstance("DES");
//2、 对工具类对象进行初始化
// mode: 加密/解密模式
// key : 对原始密钥处理之后的秘钥
SecretKeySpec key = getKey(origninKey);
cipher.init(Cipher.ENCRYPT_MODE, key);
//3、用加密工具类对象对明文进行加密
byte[] doFinal = cipher.doFinal(clearText.getBytes());
return new String(doFinal);
}
private static SecretKeySpec getKey(String origninKey) {
//用给定的字符数组构造一个密钥。
SecretKeySpec secretKeySpec = new SecretKeySpec(origninKey.getBytes(), "DES");
return secretKeySpec;
}
}
DES加密后导致乱码:


Base64 编码表




修改后的代码(应用了base64 的加解密)
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
public class DesDemo {
public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException,
IllegalBlockSizeException, BadPaddingException {
/**
* 1 明文 2 提供原始密钥:长度64位,8个字节
*
*/
String clearText = "我是傻子";
String origninKey = "12345678";
String cipherText = desEncript(clearText, origninKey);
System.out.println("DES加密后的值:"+cipherText);
String clearText2 = desDecript(cipherText, origninKey); // 解密后的明文
System.out.println("DES解密密后的值:"+clearText2);
}
/**
* 用DES 算法进行解密
*
* @param cipherText
* @param origninKey
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
private static String desDecript(String cipherText, String origninKey) throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
// 1、 获取算法工具类
Cipher cipher = Cipher.getInstance("DES");
Key key = getKey(origninKey);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decode = Base64.getDecoder().decode(cipherText);
byte[] doFinal = cipher.doFinal(decode);
return new String(doFinal);
}
/**
* 用DES 算法进行加密(就是通过对比特位进行一些数学运算)
*
* @param clearText
* @param origninKey
* @return
* @throws NoSuchPaddingException:
* 填充异常(工具模式和填充模式)
* @throws NoSuchAlgorithmException:没有此算法异常
* @throws InvalidKeyException
* 无效的密钥异常
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
private static String desEncript(String clearText, String origninKey) throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
// 1、 获取算法工具类
Cipher cipher = Cipher.getInstance("DES");
// 2、 对工具类对象进行初始化
// mode: 加密/解密模式
// key : 对原始密钥处理之后的秘钥
SecretKeySpec key = getKey(origninKey);
cipher.init(Cipher.ENCRYPT_MODE, key);
// 3、用加密工具类对象对明文进行加密
byte[] doFinal = cipher.doFinal(clearText.getBytes());
String baseCode = Base64.getEncoder().encodeToString(doFinal);
return baseCode;
}
private static SecretKeySpec getKey(String origninKey) {
// 用给定的字符数组构造一个密钥。
SecretKeySpec secretKeySpec = new SecretKeySpec(origninKey.getBytes(), "DES");
return secretKeySpec;
}
}

本文介绍了加密的起源,详细讲解了凯撒密码的原理和破解方法,接着探讨了对称加密,特别是DES算法的工作原理,以及Base64编码在加密中的作用。通过对这些基础知识的学习,读者可以对网络安全中的加密技术有初步认识。
913

被折叠的 条评论
为什么被折叠?



