密码学原理精解【5】

这里写目录标题

移位密码

概述

以 z 26 运算为例 , k 为密钥 加密: e k ( x ) = ( x + k ) m o d 26 解密: d k ( x ) = ( x − k ) m o d 26 以z_{26} 运算为例,k为密钥 \\加密:e_k(x)=(x+k) mod 26 \\解密:d_k(x)=(x-k) mod 26 以z26运算为例,k为密钥加密:ek(x)=(x+k)mod26解密:dk(x)=(x−k)mod26

实际中,我们使用 Z 256 Z_{256} Z256运算(群的加法运算)

代码

cpp 复制代码
#include <iostream>
#include <fstream>
#include<cstring>

using namespace std;

int main(){
    //加密写入
    ofstream fileOut;
    char helloTxt[]{"&9*&((@#$)((%#^^hello,world!\n123456789"};
    int txtLen{strlen(helloTxt)};
    fileOut.open("hello.data",ios::binary);
    int k=77;
    for(int i=0;i<txtLen;i++){
        fileOut<<char((helloTxt[i]+k) %256);
    }
    fileOut.close();
    //解密读出
    ifstream fileIn;
    char helloChar;
    fileIn.open("hello.data",ios::binary);
    while (fileIn.get(helloChar)){
        cout<<char((helloChar-k) %256);
    }
    fileIn.close();

  }
bash 复制代码
&9*&((@#$)((%#^^hello,world!
123456789
Process returned 0 (0x0)   execution time : 0.120 s
Press any key to continue.

希尔密码( Z 256 Z_{256} Z256)

待加密长度被3整除

cpp 复制代码
#include <iostream>
#include <fstream>
#include<cstring>
#include "e:/eigen/Eigen/Dense"

using namespace std;
using namespace Eigen;

int main(){
    //加密写入
    ofstream fileOut;
    char helloTxt[]{"123456789$#%(&Yoiu9"};
    int txtLen{strlen(helloTxt)};

    fileOut.open("hello.data",ios::binary);
    for(int i=0;i<txtLen;i+=3){
        Matrix<int,1,3> x{helloTxt[i],helloTxt[i+1],helloTxt[i+2]};
        Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};
        Matrix<int,1,3>  e_data=x*k;
        for (int j=0;j<3;j++){
            fileOut<<char(int(e_data[j]) % 256);
        }
    }
    fileOut.close();

    //解密读出
    ifstream fileIn;
    char helloChar;
    fileIn.open("hello.data",ios::binary);
    char txtBuffer[4];
    for(int i=0;i<txtLen;i+=3){
        fileIn.read(txtBuffer,3);
        Matrix<int,1,3> y{txtBuffer[0],txtBuffer[1],txtBuffer[2]};
        Matrix<int,3,3> k_ni{{9,11, 227},{101 ,152 ,37},{134 ,248 ,127}};
        Matrix<int,1,3> e_data=y*k_ni;
        for (int j=0;j<3;j++){
            cout<<char(int(e_data[j]) % 256);
        }
    }

    fileIn.close();
  }

待加密长度不一定被3整除

继续完善程序,针对加密长度不一定是3的倍数。

cpp 复制代码
#include <iostream>
#include <fstream>
#include<cstring>
#include "e:/eigen/Eigen/Dense"

using namespace std;
using namespace Eigen;

int main(){
    //加密写入
    ofstream fileOut;
    char helloTxt[]{"123456789p"};
    int txtLen{strlen(helloTxt)};


    fileOut.open("hello.data",ios::binary);
    for(int i=0;i<txtLen;i+=3){
        if ((txtLen-i)==1){
            Matrix<int,1,3> x{helloTxt[i],0,0};
            Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};
            Matrix<int,1,3>  e_data=x*k;
            for (int j=0;j<3;j++){
                fileOut<<char(int(e_data[j]) % 256);
            }
        }
        else if ((txtLen-i)==2){
            Matrix<int,1,3> x{helloTxt[i],helloTxt[i+1],0};
            Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};
            Matrix<int,1,3>  e_data=x*k;
            for (int j=0;j<3;j++){
                fileOut<<char(int(e_data[j]) % 256);
            }
        }
        else{
            Matrix<int,1,3> x{helloTxt[i],helloTxt[i+1],helloTxt[i+2]};
            Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};
            Matrix<int,1,3>  e_data=x*k;
            for (int j=0;j<3;j++){
                fileOut<<char(int(e_data[j]) % 256);
            }
        }
    }
    fileOut.close();

    //解密读出
    ifstream fileIn;
    char helloChar;
    fileIn.open("hello.data",ios::binary);
    char txtBuffer[4];
    for(int i=0;i<txtLen;i+=3){
        fileIn.read(txtBuffer,3);
        Matrix<int,1,3> y{txtBuffer[0],txtBuffer[1],txtBuffer[2]};
        Matrix<int,3,3> k_ni{{9,11, 227},{101 ,152 ,37},{134 ,248 ,127}};
        Matrix<int,1,3> e_data=y*k_ni;
        char d_data[3];
        for (int j=0;j<3;j++){
           d_data[j]=char(int(e_data[j]) % 256);
        }

        if ((txtLen-i)==2 ){
              cout<<d_data[0]<<d_data[1];
        }
        else if((txtLen-i)==1 ){
             cout<<d_data[0];
        }
        else{
            for (int j=0;j<3;j++){
              cout<<d_data[j];
            }
        }
    }

    fileIn.close();
  }
bash 复制代码
123456789p
Process returned 0 (0x0)   execution time : 0.376 s
Press any key to continue.

加解密文件

cpp 复制代码
#include <iostream>
#include <fstream>
#include<cstring>
#include "e:/eigen/Eigen/Dense"

using namespace std;
using namespace Eigen;

int main(){
    //加密写入
    ifstream  picfs("test.png", ios::ate|ios::binary);
    // 获取文件大小
    std::streampos picSize = picfs.tellg();
    picfs.close(); // 关闭文件
    std::cout << "文件长度: " << picSize << " 字节" << std::endl;

    ifstream  ifs("test.png", ios::in|ios::binary);
    char *picData=new char[picSize+1];
    for (int i=0;i<picSize;i++){
         ifs.get(picData[i]);
    }
    ifs.close();


    int txtLen{picSize};

    ofstream  fileOut;
    fileOut.open("pic.dat",ios::binary);
    for(int i=0;i<txtLen;i+=3){
        if ((txtLen-i)==1){
            Matrix<int,1,3> x{picData[i],0,0};
            Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};
            Matrix<int,1,3>  e_data=x*k;
            for (int j=0;j<3;j++){
                fileOut<<char(int(e_data[j]) % 256);
            }
        }
        else if ((txtLen-i)==2){
            Matrix<int,1,3> x{picData[i],picData[i+1],0};
            Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};
            Matrix<int,1,3>  e_data=x*k;
            for (int j=0;j<3;j++){
                fileOut<<char(int(e_data[j]) % 256);
            }
        }
        else{
            Matrix<int,1,3> x{picData[i],picData[i+1],picData[i+2]};
            Matrix<int,3,3> k{{16,91,215}, {171,253,50}, {8,186,121}};
            Matrix<int,1,3>  e_data=x*k;
            for (int j=0;j<3;j++){
                fileOut<<char(int(e_data[j]) % 256);
            }
        }
    }
    fileOut.close();

    //解密读出
    ofstream deFileOut;
    deFileOut.open("test_d.png",ios::binary);
    ifstream fileIn;
    char helloChar;
    fileIn.open("pic.dat",ios::binary);
    char txtBuffer[4];
    for(int i=0;i<txtLen;i+=3){
        fileIn.read(txtBuffer,3);
        Matrix<int,1,3> y{txtBuffer[0],txtBuffer[1],txtBuffer[2]};
        Matrix<int,3,3> k_ni{{9,11, 227},{101 ,152 ,37},{134 ,248 ,127}};
        Matrix<int,1,3> e_data=y*k_ni;
        char d_data[3];
        for (int j=0;j<3;j++){
           d_data[j]=char(int(e_data[j]) % 256);
        }

        if ((txtLen-i)==2 ){
              deFileOut<<d_data[0]<<d_data[1];
        }
        else if((txtLen-i)==1 ){
             deFileOut<<d_data[0];
        }
        else{
            for (int j=0;j<3;j++){
              deFileOut<<d_data[j];
            }
        }
    }
    deFileOut.close();
    fileIn.close();
    delete[] picData;
  }
相关推荐
MicroTech20252 天前
基于后量子密码学:微算法科技(NASDAQ: MLGO)区块链预言机加密可更新方案
科技·区块链·密码学
道法自然|~3 天前
BugCTF黄道十二宫
算法·密码学
温中志4 天前
计算机密码学基础
密码学
Jianghong Jian10 天前
Hashcat:强大的密码恢复与安全测试工具
测试工具·安全·密码学
WHD30610 天前
企业数据安全体系建设指南:从风险识别到技术落地的全流程(2026版)
大数据·网络·人工智能·安全·系统架构·密码学·安全架构
Y5neKO11 天前
某国赛CTF密码学题目Writeup:RSA
密码学·ctf·rsa
老星*12 天前
Vaultwarden:开源轻量的1Password替代,自托管密码管理方案
开源·github·密码学
山川绿水13 天前
bugku——MISC——键盘
安全·网络安全·系统安全·密码学
Sunsets_Red14 天前
乘法逆元的 exgcd 求法
c++·学习·数学·算法·c#·密码学·信息学竞赛
code_li14 天前
为什么手机没网,身份验证器也能生成验证码
智能手机·密码学