密碼學


第一章 密碼學

1.1 密碼學的基本概念

  密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密算法,經歷了古典密碼學,近代密碼學和現代密碼學三個階段。

  (1)古典密碼學

    1.替換法

      例子:例如將 b 替換成 w ,e 替換成p ,這樣bee 單詞就變換成了wpp。

    2.移位法

      例子:約定好向后移動2位(abcde - cdefg),這樣 bee 單詞就變換成了dgg 

    3.古典密碼學的破譯方式

      使用頻率分析法破解 

  (2)近代密碼學

    恩尼格瑪機

  (3)現代密碼學

    1.散列函數  

      MD5、SHA-1、SHA256

    2.對稱加密

      對稱密碼應用了相同的加密密鑰和解密密鑰。

      對稱加密分為:序列密碼(流密碼)、分組密碼(塊密碼)

    3.非對稱密碼

      非對稱密碼有兩支密鑰:公鑰和私鑰

1.2 ASCII編碼

  ASCII(American Standard Code for Information Interchange,美國信息交換標准代碼)

 

  案例:

    (1)字符轉換成Ascii碼

    (2)字符串轉換成Ascii碼

public class AsciiDeom { //(1)字符轉換成Ascii碼
 @Test public void charToAsciiTest() { char a = 'A'; int b = a; System.out.println(b);//65
 } //(2)字符串轉換成Ascii碼
 @Test public void stringToAsciiTest(){ String str = "AaZ"; char[] chars = str.toCharArray(); for(char c : chars){ int d = c; System.out.println(d);//65 97 90
 } } }

 

 

1.3 凱撒加密

  (1)中國古代加密

      解字

    

 

  (2)外國加密

       位移加密

     

  (3)凱撒位移加密

     案例:利用位移法,把Hello world向右移動3位

package com.atguigu.ascii; import org.junit.Test; public class KaiserDemo { //利用位移法,把Hello world向右移動3位
 @Test public void KaiserDemo(){ String str = "Hello world"; char[] chars = str.toCharArray(); String str1 =""; for (char c : chars){ int a = c + 3; str1 += (char)a; } System.out.println("str1 = " + str1);//str1 = Khoor#zruog
 } }

  (4)凱撒加密和解密 

package com.atguigu.ascii; import org.junit.Test; public class KaiserDemo {//凱撒位移加密和解密
    public static void main(String[] args) { String original = "Hello world"; int key = 3; //凱撒加密
        String encryptKaiser = encryptKaiser(original, key); System.out.println("encryptKaiser = " + encryptKaiser);//encryptKaiser = Khoor#zruog //凱撒解密
        String decryptkaiser = decryptKaiser(encryptKaiser,key); System.out.println("decryptkaiser = " + decryptkaiser); } //凱撒加密
    public static String encryptKaiser(String encryptDate,int key){ StringBuilder sb = new StringBuilder(); char[] chars = encryptDate.toCharArray(); for (char c : chars){ int a = c + key; sb.append((char)a); } return sb.toString(); } //凱撒解密、
    public static String decryptKaiser(String decryptKaiser,int key){ StringBuilder sb = new StringBuilder(); char[] chars = decryptKaiser.toCharArray(); for(char c : chars){ int a = c - key; sb.append((char)a); } return sb.toString(); } }

 1.5 Byte和bit

  (1)中文對應的byte和bit

  (2)英文對應的byte和bit

package com.atguigu.bytebit;

import org.junit.Test;

public class ByteBit {
    //中文對應的byte和bit
    @Test
    public void getByte02() {
        String a = "商";
        byte[] bytes = a.getBytes();
        for (byte b : bytes) {
            //對應字節
            int c = b;
            //對應位
            String s = Integer.toBinaryString(c);
            System.out.println(c + " " + s);
            /**
             * -27 11111111111111111111111111100101
             * -107 11111111111111111111111110010101
             * -122 11111111111111111111111110000110
            * */
        }
    }
    //英文對應的byte和bit
    @Test
    public void getByte03() {
        String a = "a";
        byte[] bytes = a.getBytes();
        for (byte b : bytes) {
            //對應字節
            int c = b;
            //對應位
            String s = Integer.toBinaryString(c);
            System.out.println(c + " " + s);//97 1100001
        }
    }
}

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM