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()函数进行解密,并输出结果(明文)。