首页 > 解决方案 > 密码学。获得最差的加密结果

问题描述

在下面的代码中, foo () 形成了键(取生成序列的最左边的元素)。然后使用此密钥使用 ^ 加密消息。也就是说,单词中的每个字符都必须是带有键的 ^。为此,我使用 ENCODE 功能。仅输出带有键和第一个字符的结果 ^(计算正确)。由于某种原因,其余部分没有接触。

#include <iostream>
#include <bitset>
#include <string>
#include <vector>
#include <iomanip>

std::vector<char> foo(std::vector<char>& key2) {
    uint32_t state = 0b1111111111111111111111111111111;
    uint32_t start_state2{ state };
    uint32_t period {0};
    uint32_t bit2 {0};
    do {
        bit2 = ((state >> 31) ^ (state >> 30) ^ (state >> 29) ^ (state >> 25) ^ state);
        //bit2 = key2[period];
        (key2[period]) = (bit2);
        std::cout << std::bitset<8>(key2[period]) << " ";
        state = (state >> 1) | (bit2 << 31);

        std::cout << std::bitset<32>(state) << std::endl;
        period++;

    } while ((period != 15) && (start_state2 != state));

    std::cout << "Period: " << period << std::endl;
    return key2;
}

const int SIZE{8};
void ENCODE(std::string data, std::vector<char>& key2) {
    std::vector<std::bitset<SIZE>> vec_bitset_data;

        for(unsigned i=0; i < data.size(); ++i) {
            std::bitset<SIZE> d(data[i]);
            std::bitset<SIZE> k(key2[i]);

            std::bitset<SIZE> encoded = d^k;
           std::cout << encoded << ' ';
        }
        std::cout << " ";
}

int main() {
    std::vector<char> key2(32);


    foo(key2);

    std::string data;
    data = "Hello";

    std::cout << "\nData string: " << data << '\n';
    for(unsigned i = 0; i < data.size(); i++) {
        std::bitset<8> d(data[i]);
        std::cout << d << ' ';
    }
    std::cout << '\n';

    std::cout << "Key: ";
    for(unsigned i=0; i < data.size(); ++i) {
        std::cout << std::bitset<8>(key2[i]) << " ";
    }
    std::cout << '\n';

    ENCODE(data, key2);
    return 0;
}

输出

Data string: Hello
01001000 01100101 01101100 01101100 01101111
Key: 11000010 11100001 10110111 10011100 11001110
10001010 10000100 11011011 11110000 10100001

标签: c++encryptioncryptographykey

解决方案


推荐阅读