OpenSSL C库AES_256_CTR解密明文随机变化问题排查与解决
问题:AES-256-CTR解密结果随机错误,每次执行结果不同
使用OpenSSL C库解密AES_256_CTR加密的消息时,解密得到的明文错误且每次执行结果都不同。确认每次执行时IV、密钥和密文均一致,且编写的简单加密解密演示程序功能正常,推测问题不在AES_256_CTR_decrypt函数内部。
解密函数代码
int AES_256_CTR_decrypt(unsigned char *ciphertext, int ciphertextSize, unsigned char *key, unsigned char *iv, unsigned char *plaintextBuffer) { EVP_CIPHER_CTX *ctx; int len = 0; int plaintextLen; /* Create and initialise the context */ if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors(); if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_ctr(), NULL, key, iv)) handleErrors(); // Disable padding, the total amount of data encrypted or decrypted must then be a multiple of the block size or an error will occur. if(1 != EVP_CIPHER_CTX_set_padding(ctx, 0)) handleErrors(); // this buffer "plaintextBuffer" is filled with radomly appearing stuff, for every call. if(1 != EVP_DecryptUpdate(ctx, plaintextBuffer, &len, ciphertext, ciphertextSize)) /* Failed to decrypt plaintext. */ handleErrors(); plaintextLen = len; if(1 != EVP_DecryptFinal_ex(ctx, plaintextBuffer + len, &len)) handleErrors(); plaintextLen += len; EVP_CIPHER_CTX_free(ctx); return plaintextLen; }
调用函数代码
string Verifier::decryptLog(KEY_TYPE key, XOR_TYPE encLogMessage) { array<unsigned char, IV_SIZE> iv; array<unsigned char, MESSAGE_LEN> ciphertext; unsigned char *logm = new unsigned char [MESSAGE_LEN]{0}; array<unsigned char, MAC_LEN> mac, referenceMAC; size_t macLen, len; copy_n(encLogMessage.begin(), IV_SIZE, iv.begin()); copy_n(encLogMessage.begin() + IV_SIZE, MESSAGE_LEN, ciphertext.begin()); copy_n(encLogMessage.begin() + IV_SIZE + MESSAGE_LEN, MAC_LEN, mac.begin()); CMAC(key.data(), ciphertext.data(), MESSAGE_LEN, referenceMAC.data(), &macLen, MAC_LEN); if (macLen != MAC_LEN) { cerr << "ERROR: Creating MAC failed." << endl; exit(EXIT_FAILURE); } if (mac != referenceMAC){ cerr << "Invalid MAC detected: ..." << endl; return ""; } if (MESSAGE_LEN != (len = AES_256_CTR_decrypt (ciphertext.data(), MESSAGE_LEN, key.data(), iv.data(), logm))) { cerr << "ERROR: Log encryption failed." << endl; exit(EXIT_FAILURE); } // Return log. std::string s(logm, logm+MESSAGE_LEN); delete[] logm; return s; }
环境信息
- 运行环境:XCode
- OpenSSL版本:通过Homebrew安装的openssl@3.1.2
相关数据
密文
A5 A0 EC 07 8B 23 A8 1F C9 2C B5 A1 E3 AC 5B D7 86 21 16 1C A7 85 F8 DA D9 E2 24 8E A5 38 E6 C5 43 42 98 BF 53 CB 40 97 01 62 9B 6A 7E 19 35 E3 96 72 1A 35 15 78 64 2B 24 D7 41 54 0F C5 8C 1D 37 8F 69 F3 F6 13 C2 2F 77 D3 B2 19 97 61 F3 CC 79 AE EA 11 B7 21 CD 47 40 E5 83 7F C5 37 DE 10 15 06 56 8A AD EB 29 D9 9F 21 34 94 C6 66 97 EE 35 DA A7 01 A9 F5 73 F0 E9 84 1E AE 55 1F AE 7E A4 31 44 50 DB 88 69 31 78 77 0F A6 B2 FE 2E C7 CC 9C 15 FD 7E 8A 14 85 18 50 68 A2 3B 37 46 34 D4 D4 DB CF 4E ED 42 89 DE 15 AA CB 11 A0 47 AD F8 B1 C0 DF 74 4C 7D CB 8C 43 E4 F1 68 2F C9 3A 77 46 49 EB 52 6C AA 90 87 71 F6 8D E3 71 27 38 59 36 50 D2 48 32 91 14 A9 04 45 29 3F 17 59 0B 2F 4B 12 CF 20 88 E7 8A 4A DD 00 18 98 5C 76 AC F6 63 4B D5 8B BC 01 B8 5F AB E7 2A 6E F7 ED 56 F8 05 38 4F A7 7F 95 3A 0B AE CB 90 B7 3D CC 8F 3E B0 8E 84 C6 CE 9E 4F 84 9C 8B BD FF 3B 4C F9 51 51 1C 52 58 3F 97 00 0D 6B C5 3F C1 05 D3 0E 7E B4 94 50 F4 48 3E CD 12 6A 2B B5 BC 13 6A A0 03 24 59 9B 87 0D B5 CD 24 03 E8 2E E7 7A 1E A4 7B 32 AD F4 10 61 49 E1 8F 35 BD 38 98 72 AD 75 46 85 F0 54 5A 15 4E 21 A7 22 A0 C3 A2 29 0F B8 EE A2 C6 64 6B F7 06 85 28 77 83 F9 86 4C 42 C2 92 43 75 4D 1F 36 67 54 92 0A A5 44 3F 4E FE 89 0D 4B B5 89 B0 26 F7 E5 C4 B6 2F 22 1A 87 3A 58 22 4B 25 65 06 CE EF DA 5E 15 ED 0C 44 60 52 BA 18 83 8C 12 01 23 32 74 50 2E AF 0F 3E 3E 0E FE E2 0E 39 DB 90 78 27 CB B9 FF 99 AF D1 43 7E 7A 07 13 C9 4A E0 C7 1F EA 15 FA 4F AE 9C 9D 93 10 10 80 18 CB 55 A7 DE 1B 5F 73 4B BF D5 E0 48 4E DE AE A2 D7 63 F9 7F 2E 3F 4C 58 B7 EF 8C 8F 0A 6B FF 23 6F 2A 20 F0 FC 93 A9 62 37 C3 AE 8D 7F 86 50 E0 BC CD 03 84 00 AD C7 60 03 76 5D C4 4B 94 89 03 32 8E 9C 45 56 F4 08 5E 44 67 6E 75 53 89 C5 7C 3E 22 FD E5 7B 1C 43 D3 73 AD C5 C9 7D 65 30 8E BA C4 3E 74 24 86 95 63 89 89 3B 9F 35 FD 66 C0 6A 64 A1 BE 64 84 7C 16 8B C8 54 10 B0 B2 FB 23 BA 98 02 13 F8 52 87 C8 00 71 26 FF 10 D7 09 71 A8 9F 6B D2 B0 15 F3 D3 EA 5D 77 9F C1 31 5E F7 3D D5 0F 14 18 BA A7 1B 8F A8 BD AE BF 36 CC 74 84 1B 6B 2F 33 1F 4F 91 04 2E 98 40 C6 8F CF E8 1C 00 FF 10 19 A8 4A 72 D8 E3 AA 2E E1 3C E9 92 75 86 2A 98 A8 74 48 D0 95 E0 F3 C2 29 7E 01 37 B2 46 E3 33 CB E0 09 3A 0D 96 A7 07 E7 A3 88 93 1F 93 4D C2 B4 6F 00 39 4F B6 30 6A A7 A7 64 5B 45 6C 89 BB 31 6D 79 D7 49 17 DF CF 1E 53 01 C5 5B EF A1 2D CA EB 4D F8 A9 15 39 0C 57 B4 86 8F EC 17 EC 33 2D C2 F0 1A EB 9E 7C 7F 98 16 F6 78 E7 BF A0 B2 28 D4 E8 4C F2 25 57 A9 E3 9D 03 A6 F8 B1 B9 D0 F6 58 67 26 9A 06 FA DE 3E FA 58 E9 6E F3 20 A6 8A 77 00 2F B0 AD 6C AA F6 DD 27 32 0F 5E DF A6 3B 21 BB FD 57 D0 8E B1 EC 2D 99 55 5A 8C 13 A3 E5 B7 D6 BF B5 59 14 82 69 F5 A2 08 46 43 87 D5 93 A8 07 51 04 0D 4F 70 E0 98 92 14 83 DF 6D 97 D4 2E BE A7 46 42 6C 9A ED E0 D0 EE 89 87 9C 89 75 8D 16 B7 6E 72 0A 52 CA 4E 02 21 7E DF 68 71 1E A8 87 64 00 35 E4 55 4D DF 07 97 D5 2E 68 CA 72 C4 13 A0 65 64 33 97 59 E4 8B 3B F5 B6 94 C7 CA D0 1A AC 66 0E 7B E9 24 83 76 61 6D E2 2B 0E D5 EC B8 2A 33 00 FC 61 5C 11 E9 D3 BA BE 3A 18 81 C1 63 A9 C2 01 5A 53 0A 93 74 E6 80 F6 EB 36 B0 3B D0 F0 D0 83 A1 FF 36 D9 82 B1 FA D7 F7 CA C3 81 C7 71 81 AD 4C D8 AB
IV
28 7E AB E4 7C 71 C2 2E 36 1C 1E 8D
密钥
DA D6 35 43 F3 13 1A 32 2E A2 49 A7 5B 81 2D C6 84 D9 6E B3 84 DF FC 56 C4 DF 33 CA 76 88 E6 2C
问题定位与解决
问题已确认:使用的IV仅为12字节,但AES_256_CTR要求IV长度为16字节,导致OpenSSL读取了4字节的越界内存,这部分内存数据每次执行时随机变化,最终造成解密得到的明文也随机变化。
内容的提问来源于stack exchange,提问作者Genfood
相关产品推荐
相关产品推荐

