使用 mcrypt 在 php 和 c 中进行 AES 加密

Posted

技术标签:

【中文标题】使用 mcrypt 在 php 和 c 中进行 AES 加密【英文标题】:AES encryption in php and c with mcrypt 【发布时间】:2012-11-06 18:30:20 【问题描述】:

我再次遇到了 mcrypt 的问题。我想知道为什么我在使用 rinjdael-128 cfb 模式加密的 php 和 c bei 中得到不同的结果。这是我的php函数:

function mcencrypt($Clear, $Pass)
$td = mcrypt_module_open('rijndael-128', '', 'cfb', '');
$iv = 'AAAAAAAAAAAAAAAA';
mcrypt_generic_init($td, $Pass, $iv);
$encrypted = mcrypt_generic($td, $Clear);
mcrypt_generic_deinit($td);
return $encrypted;

还有我的 c 函数:

unsigned char *Encrypt( unsigned char *key, unsigned char *message, int buff_len)

    unsigned char *Res;
    MCRYPT mfd; 
    char* IV = "AAAAAAAAAAAAAAAA";
    int i, blocks, key_size=16, block_size;

    mfd = mcrypt_module_open("rijndael-128", NULL, "cfb", NULL);
    block_size = mcrypt_enc_get_block_size(mfd);
    blocks = ceil((double)buff_len/block_size);

    mcrypt_generic_init(mfd, key, key_size, IV);
    Res = calloc(1, (blocks *block_size)+1);

    strncpy(Res, message, buff_len);
    mcrypt_generic(mfd,Res,(blocks *block_size));

    mcrypt_generic_deinit(mfd);
    mcrypt_module_close(mfd);

     return (Res);

当我在 for 循环中使用它们时,前 26 个加密是 korect,但在 27 个最后的树符号是不同的。这真的很奇怪。

在 php 中,我制作了这样的 for 循环:

$seed ="m78otPfBLT48msvd";
$key = "r2oE61IQo7VwFXnF";
$start_y= mcencrypt($seed,$key);
$new =$start_y;
$enc_prob = mcencrypt($start_y,$key);
for ($j=1; $j<30;$j++)
$new.=$enc_prob;
echo "j: ".$j.'<br>';
echo "the new: ".$enc_prob."lenght: ".strlen($enc_prob).'<br>';
echo "new in hex for j=".$j.": ".strToHex($enc_prob).'<br>';
$enc_prob=mcencrypt($enc_prob,$key);

在 c 中是这样的:

 int j, buff_len;
char seed[] = "m78otPfBLT48msvd", key1[]="r2oE61IQo7VwFXnF";
buff_len = strlen(seed);
unsigned char *encrypted, *encrypted2;
encrypted = Encrypt(key1, seed, buff_len);
encrypted2 =  Encrypt(key1, encrypted, buff_len);
for (j=1; j<cols; j++) 
    printf("j: %d\n", j);
    printf("encrypted2 %s\n", string_to_hex(encrypted2, buff_len));

    memcpy(encrypted2, Encrypt(key1, encrypted2, buff_len),buff_len);

free(encrypted);
free(encrypted2);

出了什么问题。消息和密钥是相同的。我正在使用相同的库,相同的 iv。我不明白。它很奇怪。请帮我解决这个问题。非常感谢提前!

【问题讨论】:

IV 应该是随机生成的,而不是一个固定的字符串——尤其不是像AAAAAAAAAAAAAAAA 这样的字符串。如果你这样做,你首先就违背了使用 IV 的目的。 @NullUserException 我想同时尝试一下。这就是为什么我使用相同的 iv。如果这就是问题所在,为什么 j=27 会出现不同的结果? 【参考方案1】:

我发现了问题所在。 c 中的字符串是空终止的,并且在我的加密函数中使用 strncpy 会产生问题,所以我只是在 memcpy 中更改了它,现在一切顺利。再次感谢所有尝试提供帮助并花时间查看我的问题的人。

【讨论】:

以上是关于使用 mcrypt 在 php 和 c 中进行 AES 加密的主要内容,如果未能解决你的问题,请参考以下文章

mcrypt 和 IIS - 模块不会在 PHP 中加载

使用 PHP mcrypt 加密后使用 Javascript CryptoJS 解密 AES

使用php mcrypt加密解密

使用php mcrypt加密解密

使用 OpenSSL/C++ 和 PHP/Mcrypt 的 AES-128-CBC 加密:仅解密第一个块

用wampserver配置PHP环境,想使用PHP的mcrypt加密扩展库进行加密应该怎么安装扩展库?