加解密学习之--模运算与经典密码学

Posted johnzhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加解密学习之--模运算与经典密码学相关的知识,希望对你有一定的参考价值。

密码学

模运算和经典密码学

a = r mod m
a = q*m + r

  1. 余数不唯一
    12 = 3 mod 9
    12 = 21 mod 9
    12 = -6 mod 9
    ...3,12,21,30...
  2. 上面的组合就是等价类,比如模数9还存在另外8个等价类。
    ...0,10,19...

    ...1,10,19...

    ...

    ...8,17,26...

余数的选择

一般 0 ≤ r ≤ m ? 1

整数环

  1. The set Zm = 0,1,2,...,m?1
  2. Two operations “+” and “×” for all a, b ∈ Zm such that:

    1.a + b ≡ c mod m,(c ∈ Zm)

    2.a × b ≡ d mod m,(d ∈ Zm)

ie:Z9 = 0,1,2,3,4,5,6,7,8

6 + 8 = 14 ≡ 5 mod 9

6 × 8 = 48 ≡ 3 mod 9

整数环的下列特性:

  • 任何两数相加或相乘的结果都在环里面,闭环。
  • 加乘都可以叠加
  • 总有元素0符合加法规则,a + 0 = a mod m
  • 对任何元素a总有一个负元素-a,使得 a+(-a) = 0 mod m
  • 总有元素1符合乘法规则,a*1 = a mod m
  • ...

位移加密(凯撒加密)

把26个字母编码 0到25
然后得到整数环 Z26

Definition 1.4.3 Shift Cipher

Let x,y,k ∈ Z26.

Encryption:$e_k(x) = x+k \mod 26$.

Decryption:$d_k(y) = x-k \mod 26$.

ATTACK 就是 0,19,19,0,2,10
如果k = 17,右移动17位,密文就是rkkrtb,

很不安全,通过暴力破解和词频分析就很容易解决

仿射加密

Definition 1.4.4 Affine Cipher

Let x,y,a,b ∈ Z26

Encryption: $e_k(x) = y = a \times x+b \mod 26$.

Decryption: $d_k(y) = x = a^-1 \times (y-b) \mod 26$.

with the key: k = (a, b), which has the restriction: gcd(a, 26) = 1

解密过程根据加密过程可以轻松得出:

$ a \times x+b = y \mod 26$

$ a\times x = (y-b) \mod 26 $

$x = a^-1 \times (y-b) \mod 26$

百度

c++仿射加密

#include <iostream> //仿射加密,sorcery --> welcylk
using namespace std;
#include <string.h>
int Fsenc(char s[])

    int i = 0;
    int a[99];
    char *p = s;
    while (*p != '\0')
    
        a[i] = s[i] - 'a';           // 字符转换为数字
        a[i] = (11 * a[i] + 6) % 26; // 仿射加密函数
        s[i] = a[i] + 'a';           // 数字转换为字符
        i++;
        p++;
    
    return 1;

int Fsdec(char s[])

    int i = 0;
    int a[99];
    char *p = s;
    while (*p != '\0')
    
        a[i] = s[i] - 'a';            // 字符转换为数字
        a[i] = (19 * a[i] + 16) % 26; // 仿射解密函数
        s[i] = a[i] + 'a';            // 数字转换为字符
        i++;
        p++;
    
    return 1;

int main()

    char s[99];
    gets(s);
    Fsenc(s);
    cout << "加密后:";
    for (int i = 0; i < 7; i++)
    
        cout << s[i];
        if ((i + 1) % 7 == 0)
            cout << endl;
    
    Fsdec(s);
    cout << "解密后明文:";
    for (int i = 0; i < 7; i++)
    
        cout << s[i];
        if ((i + 1) % 7 == 0)
            cout << endl;
    

以上是关于加解密学习之--模运算与经典密码学的主要内容,如果未能解决你的问题,请参考以下文章

基本运算符与模运算符

Python学习之--用户输入以及运算

算数运算——四则与取模运算

java 第12节 基本算术运算符与模运算符

a ^ b mod c 取模运算优化反思(老物)

石子游戏 IX——一场关于模运算加和规律的博弈