分组密码算法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; }评论 打赏 举报解决 1无用 1