��688 2023-03-29 09:12 采纳率: 0%
浏览 47
已结题

分组密码算法misty1的子密钥生成算法c++实现

分组密码算法MISTY1的子密钥生成算法c++实现,各位可以帮助一下么,具体就是输入(16位二进制比特输入和16位二进制比特密钥),经过FI函数输出(16位二进制比特输出),谢谢!

  • 写回答

5条回答 默认 最新

  • threenewbee 2023-03-29 09:19
    关注

    参考

    
    #include <iostream>
    #include <vector>
    #include <bitset>
    
    using namespace std;
    
    void generateSubKeys(const bitset<128>& key, vector<bitset<64>>& subKeys) {
        // S-Box values
        const unsigned char sBox[256] = {
            // values here
        };
    
        // XOR constants
        const unsigned int xorConst[8] = {
            0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC,
            0xA953FD4E, 0xC2A12D9B, 0xD7C45034, 0xE7D3FBC8
        };
    
        // Convert key to two 64-bit halves
        bitset<64> K1(key.to_ulong() >> 64);
        bitset<64> K2(key.to_ulong());
    
        // Generate 4 subkeys per round
        for (int i = 0; i < 4; i++) {
            // Compute Fi function
            bitset<64> F = ((K1 >> 32) ^ K2) & 0x7FFFFFFF;
            F ^= xorConst[i];
            F = bitset<64>(sBox[F.to_ulong() >> 24]) << 24 |
                bitset<64>(sBox[(F.to_ulong() >> 16) & 0xFF]) << 16 |
                bitset<64>(sBox[(F.to_ulong() >> 8) & 0xFF]) << 8 |
                bitset<64>(sBox[F.to_ulong() & 0xFF]);
            F = ((F << 32) | (F >> 32)) & 0xFFFFFFFFFFFFFFFE;
    
            // Compute new values for K1 and K2
            bitset<64> tmp = K1;
            K1 = (K1 << 8) | (K2 >> 56);
            K1 ^= F;
            K2 = (K2 << 8) | (tmp >> 56);
    
            // Generate subkeys
            if (i % 2 == 0) {
                subKeys.push_back(K1);
                subKeys.push_back(K2);
            }
        }
    }
    
    int main() {
        // Example key
        bitset<128> key("00000000000000000000000000000000");
    
        // Generate subkeys
        vector<bitset<64>> subKeys;
        generateSubKeys(key, subKeys);
    
        // Print subkeys
        for (int i = 0; i < 8; i++) {
            cout << "K" << i << ": " << subKeys[i].to_ulong() << endl;
        }
    
        return 0;
    }
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 修改了问题 3月29日
  • 创建了问题 3月29日