当前位置: 代码迷 >> 综合 >> 网络安全--加密入门
  详细解决方案

网络安全--加密入门

热度:109   发布时间:2023-11-22 13:25:56.0

                                 网络安全--加密入门

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;}}

  相关解决方案