数值=0; memset(state->ecount,0,AES\u块大小); /*将“ivec”中的计数器初始化为0*/ memset(状态->ivec+8,0,8); /*将IV复制到“ivec”*/ memcpy(州->ivec,iv,8); } 无效aes_编码器(字节*读,字节*写,整数大小,字节*加密键,字节*iv) { AES_密钥; 如果(AES设置加密密钥(加密密钥,128和密钥)错误(“设置加密密钥的问题”); } 初始中心(和状态,iv); AES加密(读、写、大小和密钥、state.ivec、state.ecoount和state.num); } 字节*键=(字节*)“2123456789012345”; 字节*iv=(字节*)“2ASDASD”; QByteArray message=“这是消息”; byte*data=reinterpret_cast(message.data()); aes_编码器(数据,数据,message.size(),键,iv); qDebug(),php,c++,encryption,openssl,Php,C++,Encryption,Openssl" /> 数值=0; memset(state->ecount,0,AES\u块大小); /*将“ivec”中的计数器初始化为0*/ memset(状态->ivec+8,0,8); /*将IV复制到“ivec”*/ memcpy(州->ivec,iv,8); } 无效aes_编码器(字节*读,字节*写,整数大小,字节*加密键,字节*iv) { AES_密钥; 如果(AES设置加密密钥(加密密钥,128和密钥)错误(“设置加密密钥的问题”); } 初始中心(和状态,iv); AES加密(读、写、大小和密钥、state.ivec、state.ecoount和state.num); } 字节*键=(字节*)“2123456789012345”; 字节*iv=(字节*)“2ASDASD”; QByteArray message=“这是消息”; byte*data=reinterpret_cast(message.data()); aes_编码器(数据,数据,message.size(),键,iv); qDebug(),php,c++,encryption,openssl,Php,C++,Encryption,Openssl" />

c+中的openssl加密+;和php 需要在C++中对一些数据进行编码,并在PHP中进行解码,但PHP没有正确解码。 我检查了用相同的密钥和iv编码相同的消息,结果之间存在差异。 这是我的代码: struct ctr_state { unsigned char ivec[AES_BLOCK_SIZE]; unsigned int num; unsigned char ecount[AES_BLOCK_SIZE]; }; unsigned char indata[AES_BLOCK_SIZE]; unsigned char outdata[AES_BLOCK_SIZE]; unsigned char iv[AES_BLOCK_SIZE]; struct ctr_state state; int init_ctr(struct ctr_state *state, const byte iv[16]) { /* aes_ctr128_encrypt requires 'num' and 'ecount' set to zero on the * first call. */ state->num = 0; memset(state->ecount, 0, AES_BLOCK_SIZE); /* Initialise counter in 'ivec' to 0 */ memset(state->ivec + 8, 0, 8); /* Copy IV into 'ivec' */ memcpy(state->ivec, iv, 8); } void aes_encoder(byte *read, byte *write, int size, byte *enc_key, byte *iv) { AES_KEY key; if (AES_set_encrypt_key(enc_key, 128, &key) < 0) { Logger::getInstance()->Error("problem with setting encrypt key"); } init_ctr(&state, iv); AES_ctr128_encrypt(read, write, size, &key, state.ivec, state.ecount, &state.num); } byte *key = (byte*)"2123456789012345"; byte *iv = (byte*)"2asdasdasdasdasd"; QByteArray message = "this is message"; byte *data = reinterpret_cast<byte *>(message.data()); aes_encoder(data, data, message.size(), key, iv); qDebug() << message.toBase64(); 结构中心状态 { 无符号字符ivec[AES_块大小]; 无符号整数; 无符号字符计数[AES_块大小]; }; 无符号字符indata[AES_BLOCK_SIZE]; 无符号字符输出数据[AES_块大小]; 无符号字符iv[AES_块大小]; 结构中心状态; int init_ctr(结构ctr_状态*状态,常量字节iv[16]) { /*aes\u ctr128\u encrypt要求将服务器上的“num”和“ecoount”设置为零 *第一个电话*/ 状态->数值=0; memset(state->ecount,0,AES\u块大小); /*将“ivec”中的计数器初始化为0*/ memset(状态->ivec+8,0,8); /*将IV复制到“ivec”*/ memcpy(州->ivec,iv,8); } 无效aes_编码器(字节*读,字节*写,整数大小,字节*加密键,字节*iv) { AES_密钥; 如果(AES设置加密密钥(加密密钥,128和密钥)错误(“设置加密密钥的问题”); } 初始中心(和状态,iv); AES加密(读、写、大小和密钥、state.ivec、state.ecoount和state.num); } 字节*键=(字节*)“2123456789012345”; 字节*iv=(字节*)“2ASDASD”; QByteArray message=“这是消息”; byte*data=reinterpret_cast(message.data()); aes_编码器(数据,数据,message.size(),键,iv); qDebug()

c+中的openssl加密+;和php 需要在C++中对一些数据进行编码,并在PHP中进行解码,但PHP没有正确解码。 我检查了用相同的密钥和iv编码相同的消息,结果之间存在差异。 这是我的代码: struct ctr_state { unsigned char ivec[AES_BLOCK_SIZE]; unsigned int num; unsigned char ecount[AES_BLOCK_SIZE]; }; unsigned char indata[AES_BLOCK_SIZE]; unsigned char outdata[AES_BLOCK_SIZE]; unsigned char iv[AES_BLOCK_SIZE]; struct ctr_state state; int init_ctr(struct ctr_state *state, const byte iv[16]) { /* aes_ctr128_encrypt requires 'num' and 'ecount' set to zero on the * first call. */ state->num = 0; memset(state->ecount, 0, AES_BLOCK_SIZE); /* Initialise counter in 'ivec' to 0 */ memset(state->ivec + 8, 0, 8); /* Copy IV into 'ivec' */ memcpy(state->ivec, iv, 8); } void aes_encoder(byte *read, byte *write, int size, byte *enc_key, byte *iv) { AES_KEY key; if (AES_set_encrypt_key(enc_key, 128, &key) < 0) { Logger::getInstance()->Error("problem with setting encrypt key"); } init_ctr(&state, iv); AES_ctr128_encrypt(read, write, size, &key, state.ivec, state.ecount, &state.num); } byte *key = (byte*)"2123456789012345"; byte *iv = (byte*)"2asdasdasdasdasd"; QByteArray message = "this is message"; byte *data = reinterpret_cast<byte *>(message.data()); aes_encoder(data, data, message.size(), key, iv); qDebug() << message.toBase64(); 结构中心状态 { 无符号字符ivec[AES_块大小]; 无符号整数; 无符号字符计数[AES_块大小]; }; 无符号字符indata[AES_BLOCK_SIZE]; 无符号字符输出数据[AES_块大小]; 无符号字符iv[AES_块大小]; 结构中心状态; int init_ctr(结构ctr_状态*状态,常量字节iv[16]) { /*aes\u ctr128\u encrypt要求将服务器上的“num”和“ecoount”设置为零 *第一个电话*/ 状态->数值=0; memset(state->ecount,0,AES\u块大小); /*将“ivec”中的计数器初始化为0*/ memset(状态->ivec+8,0,8); /*将IV复制到“ivec”*/ memcpy(州->ivec,iv,8); } 无效aes_编码器(字节*读,字节*写,整数大小,字节*加密键,字节*iv) { AES_密钥; 如果(AES设置加密密钥(加密密钥,128和密钥)错误(“设置加密密钥的问题”); } 初始中心(和状态,iv); AES加密(读、写、大小和密钥、state.ivec、state.ecoount和state.num); } 字节*键=(字节*)“2123456789012345”; 字节*iv=(字节*)“2ASDASD”; QByteArray message=“这是消息”; byte*data=reinterpret_cast(message.data()); aes_编码器(数据,数据,message.size(),键,iv); qDebug(),php,c++,encryption,openssl,Php,C++,Encryption,Openssl,您的问题是没有以标准方式使用CTR模式。在init\u ctr中,您仅复制所提供IV的8个字节,并将其余的设置为零。如果您使用整个IV,您将得到与PHP代码相同的结果: //don't do this: //memset(state->ivec + 8, 0, 8); //memcpy(state->ivec, iv, 8); //do this: memcpy(state->ivec, iv, AES_BLOCK_SIZE); 教训是,仅仅因为你在某个地方发现了一

您的问题是没有以标准方式使用CTR模式。在
init\u ctr
中,您仅复制所提供IV的8个字节,并将其余的设置为零。如果您使用整个IV,您将得到与PHP代码相同的结果:

//don't do this:
//memset(state->ivec + 8, 0, 8);
//memcpy(state->ivec, iv, 8);  

//do this:
memcpy(state->ivec, iv, AES_BLOCK_SIZE);  
教训是,仅仅因为你在某个地方发现了一些代码,并不意味着你可以在不了解它在做什么的情况下复制粘贴它。对于加密代码来说尤其如此。如果您知道什么是分组密码以及分组密码如何在CTR模式下工作的基本知识,那么您就会立即意识到代码的问题


哦,重要的安全提示:当使用CTR模式时,千万不要用同一个IV加密多条信息。否则你会死。

你在
memset行中使用的硬编码
8
是什么(状态->ivec+8,0,8)?我从这里得到了这段代码:在CTR模式下重用nonce完全破坏了加密。每个具有重用nonce的消息都可以在不知道密钥的情况下恢复。从互联网上复制粘贴随机代码不是编写安全相关代码的方法——你需要准确地理解每一个细节。或者,您可以使用经过测试的库。CTR模式没有任何问题。只要你不重复使用IV,那就太好了。我应该补充一点,没有“最佳”加密模式。这取决于你的具体需要。每一种都有其优点和缺点。每一个都可能被不知道自己在做什么的人错误地使用。
//don't do this:
//memset(state->ivec + 8, 0, 8);
//memcpy(state->ivec, iv, 8);  

//do this:
memcpy(state->ivec, iv, AES_BLOCK_SIZE);