• 【密码学-凯撒密码】


    现代密码学-单表代换密码

    凯撒密码原理

    凯撒密码的加密代换和解密代换分别为
    c = E k ( m ) = m + 3 ( m o d 26 ) c=E_{k}(m)=m + 3(mod 26) c=Ek(m)=m+3(mod26) 0 < = m < = 25 0<= m <= 25 0<=m<=25
    m = D k ( c ) = c − 3 ( m o d 26 ) m=D_{k}(c)=c - 3(mod 26) m=Dk(c)=c3(mod26) 0 < = c < = 25 0<=c<=25 0<=c<=25
    其中,3是加解密使用的密钥,即 k = 3 k=3 k=3,加密时,每个字母向后移3位(循环移位,字母 x x x移到 a a a y y y移到 b b b z z z移到 c c c)。解密时,每个字母向前移3位(循环移位)

    移位变换

    移位变换的加解密分别是
    c = E k ( m ) = m + k ( m o d 26 ) c=E_{k}(m)=m+k(mod 26) c=Ek(m)=m+k(mod26) 0 < = m , k < = 25 0<=m,k<=25 0<=m,k<=25
    m = D k ( c ) = c − k ( m o d 26 ) m=D_{k}(c)=c - k(mod 26) m=Dk(c)=ck(mod26) 0 < = c , k < = 25 0<=c,k<=25 0<=c,k<=25

    仿射变换

    仿射变换的加解密分别是
    c = E a , b ( m ) = a m + b ( m o d 26 ) c=E_{a,b}(m)=am+b(mod 26) c=Ea,b(m)=am+b(mod26)
    m = D a , b ( c ) = a − 1 ( c − b ) ( m o d 26 ) m=D_{a,b}(c)=a^{-1}(c-b)(mod 26) m=Da,b(c)=a1(cb)(mod26)
    其中, a , b a,b a,b是密钥,为满足 0 < = a , b < = 25 0<=a,b<=25 0<=a,b<=25 g c d ( a , 26 ) = 1 gcd(a,26)=1 gcd(a,26)=1的整数,其中 g c d ( a , 26 ) gcd(a,26) gcd(a,26)表示 a , 26 a,26 a,26的最大公因子, g c d ( a , 26 ) = 1 gcd(a,26)=1 gcd(a,26)=1表示 a a a 26 26 26是互素的, a − 1 a^{-1} a1表示 a a a的逆元,即 a − 1 ∗ a = 1 m o d 26 a^{-1}*a=1mod 26 a1a=1mod26

    代码实现

    package com.cqu;
    
    public class KaiSaEncryptionTest {
        public static void main(String args[]) {
            String input = "Hello World";
            Integer key = 3;
            String c1 = encryptionByKasStra(input);
            System.out.println(c1);
            String p1 = decryptByKasStra(c1);
            System.out.println("解密后的明文为: " + p1);
        }
    
        /**
         * 凯撒加密
         */
        private static String encryptionByKasStra(String input) {
            char[] inputArray = input.toCharArray();
            StringBuilder cipherText = new StringBuilder();
            for (char ia : inputArray) {
                int b = ia;
                b = (b + 3);
                char newb = (char) b;
                cipherText.append(newb);
            }
            return cipherText.toString();
        }
    
        /**
         * 凯撒解密
         */
        private static String decryptByKasStra(String cipherText) {
            char[] cipherArray = cipherText.toCharArray();
            StringBuilder plainText = new StringBuilder();
            for (char ca : cipherArray) {
                int m = ca;
                m = m - 3;
                char newm = (char) m;
                plainText.append(newm);
            }
            return plainText.toString();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    SwiftUI AI之如何使用 DALL-E API——生成人脸(教程含源码)
    物联网模块开发:全面助力万物物联,开启物联网时代
    2022年推荐算法效率开发必备工具榜单
    最强ADI SHARC系列DSP:ADSP-SC589的开发入门详解
    Python------API
    你的工具包已到货「GitHub 热点速览 v.22.31」
    二极管类型
    JavaScript(三)类和对象
    .NET的PLC帮助类
    linux系统常用命令
  • 原文地址:https://blog.csdn.net/weixin_43964833/article/details/125602982