密码学原理精解【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;
  }
相关推荐
曼岛_1 天前
[密码学实战]彻底理解位(bit)与字节(byte)在十六进制处理中的区别
密码学
apcipot_rain1 天前
【应用密码学】实验八 数字签名——SM2
密码学
网安INF3 天前
数据加密标准(DES)解析
java·网络安全·密码学·des
网安INF3 天前
密码学:解析Feistel网络结构及实现代码
java·网络安全·密码学·des·feistel
时之彼岸Φ3 天前
网络攻防技术二:密码学分析
网络·密码学
Turbo正则7 天前
现代密码学入门 | 现代密码学核心特点介绍
密码学·现代密码学
菜鸟破茧计划12 天前
数论:数学王国的密码学
密码学
海尔辛12 天前
5 分钟速通密码学!
网络·密码学
Chen--Xing13 天前
2025第三届黄河流域网络安全技能挑战赛--Crypto--WriteUp
python·网络安全·密码学
Turbo正则15 天前
量子计算 | 量子密码学的挑战和机遇
密码学·量子计算·量子密码学