【问题标题】:Decrypt AES string解密AES字符串
【发布时间】:2012-11-08 11:16:29
【问题描述】:

我正在使用 openssl 库来解密来自设备的一些原始字符串。

设备使用的加密是 AES - 128 位。

这是我的代码:

unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
{
  int p_len = *len, f_len = 0;
  unsigned char *plaintext = new unsigned char [p_len + 128];
  memset(plaintext,0,p_len + 128);
  syslog(LOG_NOTICE,"P_LEN BEFORE: %d",p_len);
  EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL);
  EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len);
  EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len);

  syslog(LOG_NOTICE,"P_LEN : %d",p_len);
  syslog(LOG_NOTICE,"F_LEN : %d",f_len);
  *len = p_len + f_len;

  syslog(LOG_NOTICE,"MARIMEA ESTE %d",*len);
  return plaintext;
}

我的问题是:

  1. 加密字符串长度是否等于解密字符串长度? (在 AES 128 位中)

  2. 如果 f_len 表示解密后的字节数(如果我错了,请纠正我)那为什么它小于实际解密的数据?

谢谢

【问题讨论】:

    标签: c++ openssl aes


    【解决方案1】:

    AES-128 是一种分组密码。块大小为 128 位(16 字节)。所以密文的长度总是16字节的倍数。所以密文可以比明文大。

    编辑:

    答案:

    1. 不,加密数据可以更大或等长。
    2. 错了,f_len 确实代表解密后的字节数。 (p_len + f_len) 做到了。

    【讨论】:

    • 在我的示例中,我解密的字符串是 f_len 中的 48 个字节,我只得到 32,但字符串确实是 48 个字节
    • 我怎样才能得到实际的解密数据长度?有什么想法吗?
    • 如果它是明文,在加密端,空终止它并在加密期间包含空值,这样你就可以在解密端使用终止符。如果您不进行加密,则可能已经有一个空值,或者开头的长度八位字节或结尾的填充八位字节...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多