OpenSSL AES_ecb_encrypt加密解密算法,在Windows系统上需要注意什么?

新手上路,请多包涵

OpenSSL AES_ecb_encrypt加密解密算法,在Windows系统上需要注意什么?因为我现在有问题,我写的加解密接口的数据和文件正常。通过网页加密工具获得的加密数据无法在代码中解密 我认为密钥和对齐方式是一样的,而且加密模式是使用ECB。

代码里都是保持一致的

明文-> aes,明文-> aes -> base64,都尝试过,都失败了。

所以有可能是Windows和Web工具(其他语言java,py)的加密和解密有啥注意的点吗。

std::string DecodeAES(std::string szData)
{

    std::string szDst;
        
    try
        {
            if (szData.empty())
            {
                return "";
            }

            const unsigned int uKeySize = static_cast<unsigned int>(m_szAesRecvKey.size());

            //初始化key
            AES_KEY key = { 0 };
            AES_set_decrypt_key(reinterpret_cast<const unsigned char*>(m_szAesRecvKey.data()), static_cast<int>(8 * uKeySize), &key);

            //解密
            std::vector<unsigned char> sRst(szData.size());
            for (size_t i = 0; i < szData.size(); i += AES_BLOCK_SIZE)
            {
                AES_ecb_encrypt(reinterpret_cast<const unsigned char *>(szData.data() + i), &sRst[i], &key, AES_DECRYPT);
            }

         

            //去掉填充
            const size_t pads = sRst[sRst.size() - 1];
            if (pads > 0 && pads <= uKeySize && ((sRst.size() - pads) > 0))
            {
                szDst.assign(sRst.begin(), sRst.end() - pads);
            }
        }
        catch (const std::exception)
        {
        }
        return szDst;
    }
阅读 625
avatarAI BotBETA

在使用 OpenSSL 的 AES_ecb_encrypt 函数进行加密和解密时,在 Windows 系统上需要注意以下几点:

  1. 密钥管理:密钥的生成、存储和使用需要谨慎处理。密钥应该是随机生成的,并且不应该以明文形式存储在文件中或传输过程中。建议使用安全的密钥管理工具或库来生成、存储和使用密钥。
  2. 对齐方式(Padding):在 ECB 模式下,输入的数据长度必须是块大小(对于 AES,块大小为 16 字节)的倍数。如果输入数据不是块大小的倍数,可以使用一种称为填充的技术来补足数据。在代码中,你需要确保使用相同的填充方式进行加密和解密。
  3. 加密模式:确认代码中的加密模式是 ECB 模式。在 OpenSSL 中,你可以使用 AES_set_encrypt_keyAES_set_decrypt_key 函数来设置加密和解密的密钥。确保在设置密钥时使用相同的加密模式。
  4. 错误处理:代码应该能够恰当地处理可能发生的错误。在解密过程中,如果输入的数据被篡改或损坏,解密可能会失败。因此,你应该在代码中添加适当的错误处理逻辑,以便在解密失败时能够检测到错误并采取适当的措施。
  5. 内存管理:由于是在 C++ 中使用 OpenSSL,需要注意内存管理问题。在解密后,记得释放掉不再使用的内存,避免内存泄漏。
  6. 兼容性:虽然你的代码和网页加密工具使用的算法和模式看起来是一样的(都是 ECB 模式),但是在细节上可能存在差异。例如,网页加密工具可能使用了不同的填充方式或密钥长度。确保你的代码和网页加密工具在所有方面都保持一致,包括填充方式、密钥长度等。

在你的代码中,已经注意到了对齐方式(使用了填充),并且在解密时也去掉了填充。这是正确的做法。然而,如果填充的字节数不是固定的,或者填充的方式不是标准的填充(例如 PKCS7),那么可能会导致解密失败。

此外,还需要确认密钥是一样的。你可以尝试将你的密钥和网页加密工具使用的密钥进行比较,确认它们是否完全相同。如果密钥不同,那么加密和解密的结果肯定是不一样的。

最后,虽然不太可能,但是仍然需要确认网页加密工具的加密和解密逻辑是正确的。如果网页加密工具的逻辑有误,那么也会导致你的代码无法解密。

希望这些信息对你有所帮助!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏