C++中的Ciphersaber解密算法

Posted

技术标签:

【中文标题】C++中的Ciphersaber解密算法【英文标题】:Ciphersaber Decryption Algorithm in C++ 【发布时间】:2020-12-11 10:29:53 【问题描述】:

我正在尝试使用 C++ 完成 Ciphersaber 解密算法。我从来没有做过任何与加密或解密相关的事情,所以我有点迷茫。该算法基于RC4。

经过几次尝试,我终于得到了一些似乎可以工作的代码,但根本没有显示正确的输入结果。这就是我打电话的原因。是否有人熟悉这种类型的解密算法能够告诉我我做错了什么?

非常感谢您的帮助!谢谢你。有任何疑问都可以问我。

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <vector>
#include <fstream>

using namespace std;

struct Parameters 
    std::string EncryptedData;
    std::string EncryptionKey;
    int InitialVectorLength;
    int KeyLoopIterations;
    
    void LoadParameters() 
        EncryptedData = "6f 6d 0b ab f3 aa 67 19 03 15 30 ed b6 77 ca 74 e0 08 9d d0 e7 b8 85 43 56 bb 14 48 e3 7c db ef e7 f3 a8 4f 4f 5f b3 fd";
        EncryptionKey = "asdfg";
        InitialVectorLength = 10;
        KeyLoopIterations = 1;
    ;
;

void RC4(int n, int r, char* k, int l, unsigned char* keystream) 
    unsigned char S [256] =  ;
    for(int i=0; i<256; i++) 
        S[i]=i;
      

    int j=0;
    for(int ri=0; ri<r; ri++) 
        for(int i=0; i<256; i++) 
            j = (j + S[i] + k[i%l]) % 256;
            swap(S[i], S[j]);
        
    

    j=0;
    int ip;
    for(int i=0; i<n; i++) 
        ip = (i+1) % 256;
        j = (j+S[ip]) % 256;
        swap(S[ip], S[j]);
        keystream[i] = S[(S[ip]+S[j]) % 256];
    
;

void Decrypt(std::string m, int iv_length, std::string k, int r) 
    int n = m.length() + iv_length;
    unsigned char output[1024];

    char iv [iv_length];
    for(int i=0; i<iv_length; i++) 
        iv[i] = m[i];
       

    char msg_no_iv [n-iv_length];
    for(int k=0; k<n-iv_length; k++) 
        msg_no_iv[k]=m[k+iv_length];
      

    char kp[k.length()+iv_length];
    for(unsigned int i=0; i<k.length(); i++) 
        kp[i] = k[i];
    

    for(unsigned int i=k.length(); i<k.length()+iv_length; i++) 
        kp[i] = iv[i-k.length()];
    

    unsigned char keystream [256];
    RC4(n, r, kp, k.length()+iv_length, keystream);  

    for(int i=0; i<n-iv_length; i++)  
        output[i] = msg_no_iv[i] ^ keystream[i];
    
    
    cout << output;
;

int main()

    Parameters params;
    params.LoadParameters();
    
    Decrypt(params.EncryptedData, params.InitialVectorLength, params.EncryptionKey, params.KeyLoopIterations);
    
    return 0;
;

预期输出:

This is a test of CipherSaber.

有用的链接:

什么是 CipherSaber? https://en.wikipedia.org/wiki/CipherSaber CipherSaber官网:http://ciphersaber.gurus.org/ 一些使用该算法的存储库:https://github.com/search?q=ciphersaber&ref=opensearch

【问题讨论】:

这段代码无法编译。 在哪里?对我来说确实编译:/ 【参考方案1】:

查看您的实现后,我发现加密数据是十六进制的,您没有将其转换回来。 另外,不要将unsigned charchar 混用。

【讨论】:

以上是关于C++中的Ciphersaber解密算法的主要内容,如果未能解决你的问题,请参考以下文章

C++实现RSA加密解密算法

求RSA加密解密算法,c++源代码

swift中的DES加密解密算法

des加密 c++ java

Java 中的 Vigenere 密码算法 - 将消息解密为明文

.txt 文件中的 Ascii 控制字符问题、XOR 加密、C++