c++ - 关于在 S-DES 中实现扩展函数的更有效方法的简单问题

标签 c++ cryptography des

那么,我正在用 C++ 实现(简化的)-DES,并且我有一个有效的 Expander 函数。扩展函数定义为,给定一个 6 条目输入(比如 {1,2,3,4,5,6},我们输出一个新的 8 条目输出,形式如下:{1,2,4,3 ,4,3,5,6}。我按如下方式实现了这个,但我确信有更好、可能更快的方法来实现它。有什么建议吗?

void expandchars(std::vector<int> &vec){
std::vector<int> temp=vec;
vec={temp[0],temp[1],temp[3],temp[2],temp[3],temp[2],temp[4],temp[5]};
}

最佳答案

更快的方法是避免分配临时 vector 。如果vec.capacity() < 8那么你的代码几乎是最优的。为了使其最佳化:

void realloc_expandchars(std::vector<int> &vec){
  // Optimal if vec.capacity() <8, since a reallocation is unavoidable
  std::vector<int> temp=std::move(vec);
  vec={temp[0],temp[1],temp[3],temp[2],temp[3],temp[2],temp[4],temp[5]};
}

如果vec.capacity() >= 8那么你可能想避免创建一个新的 vector 。为此,您可能想要执行以下操作:

void inplace_expandchars(std::vector<int> &vec){
    vec.insert(vec.begin() + 4, 2 /*count*/, 0 /* value */);
    vec[4] = vec[3];
    vec[5] = vec[2];
    vec[2] = vec[4];
    vec[3] = vec[5];
}

使用 std::array 可能稍微慢一点,但可读性更好:

void inplace_expandchars(std::vector<int> &vec){
    std::array<int, 8> temp = {vec[0], vec[1], vec[3], vec[2], vec[3], vec[2], vec[4], vec[5]}; 
    vec.clear();
    vec.insert(vec.begin(), temp.begin(), temp.end());
}

然后将它们组合起来:

   void expandchars(std::vector<int> &vec){
     if (vec.capacity() < 8)
         realloc_expandchars(vec);
     else
         inplace_expandchars(vec);
   }

关于c++ - 关于在 S-DES 中实现扩展函数的更有效方法的简单问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55277620/

相关文章:

c++ - 这行得通吗? C++ 多重继承和构造函数链接

c++ - 尝试创建可变参数 C++ 输入函数

c++ - Codeblocks Windows 和 makefile 生成 C++

cryptography - 带有 WinCrypt 和 CryptImportKey 的硬编码 AES-256 key

php - 不使用HTTPS登录,如何安全?

C#-从流中序列化/反序列化DES加密文件

c++ - 如何减少 golang tcp 服务器中的 cpu 使用率?

c# - 是否建议使用 ECB 密码模式?

java - 解密错误 : javax. crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是 8 的倍数

java - 我如何使用 Java 实现暴力攻击 TripleDES?