【问题标题】:C++ Des encryption with 16 bytes key使用 16 字节密钥的 C++ Des 加密
【发布时间】:2016-08-04 15:59:37
【问题描述】:

我正在尝试使用 16 字节密钥在 DES 中加密具有动态长度的文本,但是密钥和文本的块大小存在问题,我正在使用 openssl 库进行 DES 加密。如何使用长度为 16 字节的密钥。

这是我的例子:

char * Encrypt( char Key, char *Msg, int size) { 
      static char*    Res;
      DES_cblock      Key2;
      DES_key_schedule schedule;

      Res = ( char * ) malloc( size );

      memcpy(Key2, Key, 8);
      DES_set_odd_parity( &Key2 );
      DES_set_key_checked( &Key2, &schedule );

      unsigned char buf[9];    
      buf[8] = 0;

      DES_ecb_encrypt(( DES_cblock  ) &Msg, ( DES_cblock  ) &buf, &schedule, DES_ENCRYPT );    
      memcpy(Res, buf, sizeof(buf));    
      return (Res);
}

int main(int argc, char const *argv[]) {
      char key[] = "password";
      char clear[] = "This is a secret message";
      char *encrypted;

      encrypted = (char *) malloc(sizeof(clear));

      printf("Clear text\t : %s \n",clear); 

      memcpy(encrypted, Encrypt(key, clear, sizeof(clear)), sizeof(clear));

      printf("Encrypted text\t : %s \n",encrypted);
      return 0;
}

【问题讨论】:

  • 小心,您显示的代码中存在内存泄漏。你在哪里释放你在Encrypt函数中分配的内存?
  • AES 是否接受 16 字节密钥?
  • AES 允许 128、192 和 256 位密钥。
  • AES = "高级加密标准", DES = "不推荐使用的加密标准"™。
  • 由于这是 C++ 代码,您不应该使用原始指针,也不应该进行手动内存管理。要安全地管理内存缓冲区,请使用 std::vector<char>std::unique_ptr<char[]>

标签: c++ des


【解决方案1】:
  1. DES 有一个 8 字节的 56 位密钥(LSB 不用作密钥的一部分,它用于奇偶校验)所以你不能使用 16 字节的密钥(奇偶校验通常被忽略) .

  2. 不要使用 DES,它不安全,已被 AES 取代。

  3. 不要使用 ECB 模式,它不安全,请参阅ECB mode,向下滚动到 Penguin。

AES 允许 128、192 和 256 位密钥。

【讨论】:

  • 我同意 - 不应再使用 DES,有动机的攻击者可以在数小时内将其破解。
猜你喜欢
  • 2015-06-22
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2018-10-14
相关资源
最近更新 更多