单表代换密码

1.加密原理

在这里插入图片描述

字母表如下:
在这里插入图片描述
每个字母和数字一一对应,这样对26取模就非常方便了

2.加解密算法

2.1凯撒加密

2.1.1加密

PHP实现

<?php
/**
 * ord():字符串变数字
 * chr():数字变字符串
 * 算字符串长度:strlen
 */
function caesarCipher(string $str):string
{
    
    
    $arr = [];
    for ($i = 0;$i < strlen($str);$i++)
    {
    
    
         $chr = ord($str[$i]);
         $chr = ($chr+3) % 122;
         if($chr<97)
         {
    
    
             $chr+=96;
         }
         array_push($arr,chr($chr));
    }
    return implode('',$arr);
}
echo  caesarCipher('axyz');

2.1.2解密

PHP实现

/**
 * ord()
 * chr()
 * 算字符串长度:strlen
 */
function caesarDecode(string $str):string
{
    
    
    $arr = [];
    for ($i = 0;$i < strlen($str);$i++)
    {
    
    
        $chr = ord($str[$i]);
        $chr = ($chr-3) % 122;
        if($chr<97)
        {
    
    
            $chr+=96;
        }
        array_push($arr,chr($chr));
    }
    return implode('',$arr);
}
echo  caesarCipher('axyz');

2.2移位变换

2.2.1加密

PHP实现

<?php
function shiftEncryption(string $str,int $k):string
{
    
    
    $arrStr = str_split($str);
    $arrTb = [];
    $array = [];
    for($i = 97;$i<=122;$i++)
    {
    
    
        $array[chr($i)] = $i - 97;
    }
     foreach ($arrStr as $key=>$value)
     {
    
    

         array_push($arrTb,chr( (($key+$k)%26)+97));
     }
     return implode('',$arrTb);
}
echo shiftEncryption('abc',3);

2.2.2解密

PHP实现

<?php
function shiftEncryption(string $str,int $k):string
{
    
    
    $arrStr = str_split($str);
    $arrTb = [];
    $array = [];
    for($i = 97;$i<=122;$i++)
    {
    
    
        $array[chr($i)] = $i - 97;
    }
    foreach ($arrStr as $key=>$value)
    {
    
    
        if(($array[$value]-$k) > 0) {
    
    
            array_push($arrTb, chr(($array[$value] - $k) + 97));
        }else
        {
    
    
            array_push($arrTb, chr(($array[$value] - $k + 26) + 97));
        }
    }
    return implode('',$arrTb);
}
echo shiftEncryption('aet',3);

C语言实现

2.3仿射变换

仿射变换的加密解密分别是:
c = Ea,b(m) ≡ a, + b(mod 26)
m = Da,b© ≡ a^-1(c - b)(mod 26)
其中,a,b是密钥,为满足0≤a,b≤25和gcd(a,26)等于1的整数。
其中gcd(a,26)表示a和26的最大公因子,gcd(a,26)=1表示a和26是
互素的,a-1表示a的逆元,即a-1*a ≡ 1mod26。

2.3.1加密

PHP实现

/**
 * @param string $str
 * @return string
 * 反射加密
 *
 */
function reflectionEncript(string $str,int $a,int $b):string
{
    
    
    $arr1 = str_split($str);
    $arr2 = [];
    $array = [];
    for($i = 97;$i<=122;$i++)
    {
    
    
        $array[chr($i)] = $i - 97;
    }

    foreach ($arr1 as $key=>$value)
    {
    
    
        $m = $array[$value] * $a + $b;
        $m %= 26;
        $m += 97;
        array_push($arr2,chr($m));
    }
    return implode('',$arr2);
}

echo reflectionEncript('sec',7,21);

2.3.2解密

C语言实现

#include <stdio.h>

int modular_inverse(int a, int m) {
    
    
    int m0 = m, t, q, x0 = 0, x1 = 1;

    if (m == 1)
       return 0;

    while (a > 1) {
    
    
        q = a / m;
        t = m;
        m = a % m;
        a = t;
        t = x0;
        x0 = x1 - q * x0;
        x1 = t;
    }

    if (x1 < 0)
       x1 += m0;

    return x1;
}

void decrypt(char ciphertext[], int a, int b) {
    
    
    int i = 0;
    int inverse_a = modular_inverse(a, 26);
    int length = strlen(ciphertext);
    char plaintext[length];

    for (i = 0; i < length; i++) {
    
    
        int c = (int) ciphertext[i] - 97;
        int m = (inverse_a * (c - b)) % 26;

        if (m < 0)
            m += 26;

        plaintext[i] = (char) (m + 97);
    }

    printf("Plaintext: %s\n", plaintext);
}

int main() {
    
    
    char ciphertext[] = "jgnnq";
    int a = 5;
    int b = 8;

    decrypt(ciphertext, a, b);

    return 0;
}

在这个示例代码中,我们使用modular_inverse()函数来计算逆元。然后,decrypt()函数接受密文、参数a和参数b,依次对每个字符进行解密操作。
在main()函数中,我们提供了一个示例密文(“jgnnq”),以及参数a和参数b的值(5和8)。然后,我们调用decrypt()函数进行解密,并输出结果(明文)。

猜你喜欢

转载自blog.csdn.net/qq_53568983/article/details/126867501