[英]openssl encryption in c++ and 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();
结果是:“ hF / nlW4e + FmuF8Bfny9M”
和php代码:
<?php
$message = "this is message";
$key = "2123456789012345";
$iv = "2asdasdasdasdasd";
$encrypted = openssl_encrypt($message, 'aes-128-ctr', $key, true, $iv);
echo base64_encode($encrypted);
结果:“ RLLUkP54El9FCeWpO / bI”
为什么结果不一样?
您的问题是您没有以标准方式使用点击率模式。 在init_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);
这个教训是,仅仅因为您在某个地方找到了一些代码,并不意味着您可以在不了解其功能的情况下进行复制-n-粘贴。 对于加密代码尤其如此。 如果您甚至知道分组密码是什么以及密码在CTR模式下如何工作的基础知识,您都将直接意识到代码的问题。
哦,重要的安全提示:使用CTR模式时,切勿使用相同的IV加密多个消息。 否则你会死。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.