密码学原理精解【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;
  }
相关推荐
Zevalin爱灰灰1 天前
现代密码学 第二章——流密码【下】
算法·密码学
其实防守也摸鱼3 天前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
Zevalin爱灰灰3 天前
现代密码学 第四章——公钥密码【上】
安全·密码学
岁岁的O泡奶3 天前
NSSCTF_crypto_[LitCTF 2023]babyLCG
经验分享·python·算法·密码学·crypto·流密码
Zevalin爱灰灰3 天前
现代密码学 第一章——概述
密码学
Zevalin爱灰灰4 天前
现代密码学 第三章——分组密码【上】
密码学
其实防守也摸鱼4 天前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
Zevalin爱灰灰5 天前
现代密码学 第二章——流密码【上】
密码学
开源Z5 天前
WeDPR v3.0 适配国密(SM)区块链节点部署实战:填坑官方文档未覆盖的配置
区块链·密码学·可信计算技术
其实防守也摸鱼6 天前
CTF密码学综合教学指南--第三章
开发语言·网络·python·安全·网络安全·密码学